Einfach ausgedrückt kann es deklarativ im Format voluptuous / named tuple beschrieben werden, das zum Zeitpunkt der Generierung validiert wird. Es ist für die sogenannte Fallklassenverwendung vorgesehen.
Wenn Sie beispielsweise verschiedene Zeilenelemente in der Datenbank verarbeiten, ist das Rohdiktat in Ordnung, aber ich möchte es so eingeben, dass die Absicht durch den Indexzugriff oder den langweiligen Code selbst vermittelt werden kann. Zu diesem Zweck ist es jedoch zu passend, um die Klasse zu definieren. Denkst du nicht? ich habe
Sie können auch toolz oder fn.py verwenden, um in Python wie FP zu schreiben. Denken Sie jemals, dass Sie ein unveränderliches Objekt wollen? ich habe
Beides sind Probleme, die einfach mit namedtuple gelöst werden können. Darüber hinaus muss der Attributtyp überprüft werden, was beim Schreiben einer großen Menge an Anwendungscode problematisch wird. Es gab zum Beispiel, dass ich eine ISO-8601-Zeichenfolge automatisch in datetime konvertieren wollte.
Als Reaktion auf diese Situation möchte typedtuple eine Implementierung bereitstellen, in der die Typprüfung und -konvertierung automatisch durchgeführt wird, wenn ein namedtuple erstellt wird, indem einfach die Typstruktur deklarativ beschrieben wird.
Ich habe viel in [hier] geschrieben (https://github.com/xica/typedtuple), aber benutze "typedtuple.TypedTuple" genauso wie "namedtuple" oder "typedtuple.schema" (Eigenschaft und Methode für TypedTuple) (Wenn Sie hinzufügen möchten), definieren Sie den Typ, indem Sie "voluptuous.Schema" angeben. Beim Erstellen der Instanz wird das angegebene Schema verwendet, um den Wert zu überprüfen und eine automatische Konvertierung durchzuführen. Informationen zur Überprüfung / Konvertierung durch üppige Informationen finden Sie in diesem Dokument oder 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 konvertiert automatisch alles, was in Float konvertiert werden kann
print v0 # Vector(x=10.0, y=20.0)
v1 = Vector(x='x', y=20.0) # raises exception
# TypedTuple=Da es sich um ein benanntes Tupel handelt und unveränderlich ist, wird das Aktualisieren von Attributen ein benanntes Tupel genannt._Verwendet replace, um einen weiteren Wert zu generieren
v2 = v0._replace(y=30.0)
Da die Struktur durch "dict" angegeben wird, was die Reihenfolge der Elemente nicht garantiert, ist es nicht möglich, die Reihenfolge der Attribute so anzugeben, wie sie ist, obwohl sie tatsächlich "Tupel" ist. Es sollte kein Problem für die grundlegende Verwendung sein, aber wenn Sie die Reihenfolge genau angeben möchten, können Sie collection.OrderedDict
verwenden.
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 #Sie müssen('x', 'y', 'z')werden(OrderedDictを使わない場合、順序は不定werden)
Eine weitere Einschränkung ist, dass es wahrscheinlich ziemlich schwer zu generieren ist. Vielleicht kann nicht geholfen werden, also nehmen Sie einen Benchmark.
from voluptuous import All, Range, Length, Optional
from typedtuple import schema
@schema({
'id': All(int, Range(min=0)), #id ist immer eine positive ganze Zahl
'password': All(str, Length(min=8)), #Das Passwort besteht aus mindestens 8 Zeichen
'first_name': str,
'last_name': str,
Optional('nickname'): str, #Kann beim Generieren weggelassen werden, wenn Optional eingestellt ist
})
class User(object):
# typedtuple(Oder besser gesagt Tupel)Es können keine Attribute hinzugefügt werden, aber Eigenschaften und Methoden können hinzugefügt werden
@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')
Ich werde bald über üppig schreiben.
Recommended Posts