[PYTHON] Ich habe ein verrücktes Ding namens getipptes Tupel gemacht

Was ist typedtuple?

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.

Ein bisschen mehr Detail

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.

Wie benutzt man

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)  

wichtiger Punkt

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.

Andere Beispiele

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')

das Ende

Ich werde bald über üppig schreiben.

Recommended Posts

Ich habe ein verrücktes Ding namens getipptes Tupel gemacht
Ich habe einen Python-Text gemacht
Ich habe einen Zwietrachtbot gemacht
Ich habe eine C ++ - Lernseite erstellt
Ich habe einen Line-Bot mit Python gemacht!
Ich habe ein CUI-basiertes Übersetzungsskript erstellt (2)
Ich habe einen Wikipedia Gacha Bot gemacht
Ich habe mit Python eine Lotterie gemacht.
Ich habe ein CUI-basiertes Übersetzungsskript erstellt
Ich habe mit Python einen Daemon erstellt
Ich habe ein Spiel namens Battle Ship mit Pygame und Tkinter gemacht
Ich habe einen Bash namens Powerline-Shell eingebaut, der mich verrückt macht
Ich habe ein Dash-Docset für Holoviews erstellt
Ich habe ein Pay-Management-Programm in Python erstellt!
Ich berührte "Orator" und machte mir eine Notiz
Ich habe mit Python einen Zeichenzähler erstellt
Anfänger: Ich habe einen Launcher mit dem Wörterbuch erstellt
Ich habe einen Gesprächspartner wie Siri gemacht
Ich habe ein Skript erstellt, um Piktogramme anzuzeigen
Ich habe mit Python eine Hex-Map erstellt
Ich habe ein Lebensspiel mit Numpy gemacht
Ich habe einen Hanko-Generator mit GAN gemacht
Ich habe ein automatisches Stempelwerkzeug für den Browser erstellt.
Nachdem ich Python3 studiert hatte, machte ich einen Slackbot
Ich habe mit Python ein schurkenhaftes Spiel gemacht
Ich habe mit Python einen einfachen Blackjack gemacht
Ich habe mit Python eine Einstellungsdatei erstellt
Ich habe eine Bibliothek für versicherungsmathematische Versicherungen erstellt
Ich habe eine WEB-Bewerbung bei Django gemacht
Ich habe mit Python einen Neuronensimulator erstellt
Ich habe einen Stempelersatzbot mit Linie gemacht
Ich habe eine Python-Wörterbuchdatei für Neocomplete erstellt
Ich habe mit Python eine Bot-Wettervorhersage gemacht.
Ich habe einen Ersatz2-Algorithmus für uWSGI billiger gemacht
Ich habe ein nützliches Tool für Digital Ocean erstellt
Ich habe eine GUI-App mit Python + PyQt5 erstellt
Ich habe versucht, mit Python einen Twitter-Blocker für faule Mädchen zu machen
[Python] Ich habe mit Tkinter einen Youtube Downloader erstellt.
Ich habe ein Router-Konfigurationssammlungstool Config Collecor erstellt
Ich habe eine einfache Brieftasche aus Bitcoin mit Pycoin gemacht
Ich habe einen Downloader für wortverteilte Ausdrücke erstellt
Ich habe einen LINE Bot mit Serverless Framework erstellt!
Ich habe ein Tool erstellt, um Hy nativ zu kompilieren
Ich habe ein Tool erstellt, um neue Artikel zu erhalten
Ich habe mit Numpy eine Grafik mit Zufallszahlen erstellt
Wir haben ein Peeping-Prevention-Produkt für die Telearbeit entwickelt.
Ich habe einen einfachen RSS-Reader ~ C Edition ~ gemacht
Ich habe ein Caesar-Kryptografieprogramm in Python erstellt.
Ich habe mit Python ein Bin-Picking-Spiel gemacht
Mattermost Bot mit Python gemacht (+ Flask)
Python Qiita API Wrapper "qiipy" gemacht
[AWS] Ich habe BOT mit LINE WORKS daran erinnert
Ich habe einen Twitter BOT mit GAE (Python) gemacht (mit einer Referenz)
Ich habe tatsächlich statisch ein passendes Snippet mit mypy getippt
Lassen Sie uns Chat-Benutzerverwaltungstool gemacht
Ich habe einen Anmelde- / Abmeldevorgang mit Python's Bottle durchgeführt.
Ich habe mit Play with Docker einen gebrauchsfertigen Syslog-Server erstellt
Ich habe mit Python ein Weihnachtsbaum-Beleuchtungsspiel gemacht