Pour le dire clairement, il peut être décrit de manière déclarative au format voluptueux / tuple nommé qui valide au moment de la génération. Il est destiné à une utilisation dite de classe de cas.
Par exemple, lors de la gestion de divers éléments de ligne dans la base de données, le dict brut convient, mais je veux le taper de sorte que l'intention puisse être transmise par un accès en indice ou le code terne lui-même, mais à cette fin, il correspond trop pour définir la classe. Tu ne penses pas? j'ai
Vous pouvez également utiliser toolz ou fn.py pour écrire en python comme FP, Pensez-vous que vous vouliez un objet immuable? j'ai
Ces deux problèmes peuvent être résolus simplement en utilisant namedtuple, mais en plus de cela, il est nécessaire de vérifier quel est le type d'attribut maintenant, ce qui devient gênant lors de l'écriture d'une grande quantité de code d'application. Il y avait, par exemple, que je voulais convertir automatiquement une chaîne de caractères ISO-8601 en datetime.
En réponse à cette situation, typedtuple vise à fournir une implémentation dans laquelle la vérification et la conversion de type sont automatiquement effectuées lorsqu'un namedtuple est créé simplement en décrivant de manière déclarative la structure de type.
J'ai beaucoup écrit dans ici, mais utilisez typedtuple.TypedTuple
de la même manière que namedtuple ou utilisez le décorateur typedtuple.schema
(propriété et méthode pour TypedTuple) Si vous voulez ajouter), définissez le type en spécifiant voluptuous.Schema
. Lorsque l'instance est créée, le schéma spécifié est utilisé pour vérifier la valeur et effectuer une conversion automatique. Pour la vérification / conversion par volupté, reportez-vous à ce document ou code.
from typedtuple import TypedTuple
from voluptuous import Coerce
Vector = TypedTuple('Vector', {'x': Coerce(float), 'y': Coerce(float)})
v0 = Vector(x=10, y='20.0')
# voluptuous.Coerce convertira automatiquement tout ce qui peut être converti en flottant
print v0 # Vector(x=10.0, y=20.0)
v1 = Vector(x='x', y=20.0) # raises exception
# TypedTuple=Puisqu'il est nommé tuple et immuable, la mise à jour des attributs est nommé tuple._Utilisera replace pour générer une autre valeur
v2 = v0._replace(y=30.0)
Puisque la structure est spécifiée par «dict», qui ne garantit pas l'ordre des éléments, il n'est pas possible de spécifier l'ordre des attributs tel qu'il est même s'il s'agit en fait d'un «tuple». Cela ne devrait pas être un problème pour une utilisation basique, mais si vous voulez spécifier l'ordre strictement, vous pouvez utiliser collections.OrderedDict
.
from collections import OrderedDict
from typedtuple import TypedTuple
from voluptuous import Coerce
Vector = TypedTuple('Vector', OrderedDict((('x', Coerce(float)), ('y', Coerce(float))))
print Vector._fields #vous devez('x', 'y', 'z')devenir(OrderedDictを使わない場合、順序は不定devenir)
Une autre mise en garde est qu'il est probablement assez lourd à générer. Peut-être que cela ne peut pas être aidé, alors prenez une référence.
from voluptuous import All, Range, Length, Optional
from typedtuple import schema
@schema({
'id': All(int, Range(min=0)), #id est toujours un entier positif
'password': All(str, Length(min=8)), #le mot de passe est une chaîne de 8 caractères ou plus
'first_name': str,
'last_name': str,
Optional('nickname'): str, #Peut être omis lors de la génération s'il est défini sur Facultatif
})
class User(object):
# typedtuple(Ou plutôt nommé tuple)Impossible d'ajouter des attributs, mais des propriétés et des méthodes peuvent être ajoutées
@property
def full_name(self):
return '{} {}'.format(self.first_name, self.nick_name)
# raises exception
alice = User(id=-1, password='xxxxxxxx', first_name='Alice', last_name='Kakehashi', nick_name='kkhs')
# raises exception
bob = User(id=1, password='short', first_name='Bob', last_name='Kakehashi', nick_name='kkhs')
# nick_name is optional
carol = User(id=2, password='xxxxxxxx', first_name='Carol', last_name='Kakehashi')
J'écrirai bientôt sur le voluptueux.
Recommended Posts