- fieldenum ist ein Enum mit Werten (das instanziiert werden kann).
- Unterstützt auf elegante Weise Rust-Enums mit Feldern.
- Es versucht, ein Gleichgewicht zwischen der Reinheit der funktionalen Programmierung und der Praxistauglichkeit in Python zu finden.
- Standardmäßig werden
Option als Alternative zu None und BoundResult als Alternative zu Ausnahmen unterstützt.
- Es ist vollständig getestet.
- Die englische Dokumentation ist noch dürftig, soll aber nach und nach ausgebaut werden.
- Unterstützung in verschiedenster Form wie Issues, PRs und Stars ist jederzeit willkommen.
14 Kommentare
Ich frage mich, ob ein Union-Typ mit
dataclassnicht besser wäre; abgesehen von der kürzeren Deklaration sehe ich ehrlich gesagt kaum Vorteile. Gibt es Punkte, in denenfieldenumbesonders überlegen ist?Dass die Deklaration kurz, prägnant und auf das Nötige beschränkt ist, ist ebenfalls ein großer Vorteil.
Zum Beispiel:
Wenn man das obige
fieldenummitdataclassimplementieren möchte, muss man es folgendermaßen schreiben.Der Code wird länger, schwerer lesbar, fehleranfälliger und wirkt auch nicht besonders sauber, oder?
Selbst wenn man es so schreibt, stehen zudem viele weitere Funktionen von
fieldenum(Generics,repr,__fields__, ...) nicht zur Verfügung.Daher ist ein
fieldenum, das all das bereits implementiert und bündelt, deutlich praktischer.Außerdem lohnt sich ein Blick in den Abschnitt
Beispiele.dataclassunterstützt standardmäßig einerepr-Implementierung.dataclasses.fieldsstellt Laufzeitinformationen über Felddefinitionen bereit.typingunterstützt, syntaktischer Zucker seit 3.12.Messagesist eine Implementierung als Modul möglich.Trotzdem kann es ein Vorteil sein, dass kein Boilerplate-Code für die Klassendefinitionen nötig ist und dass sich Enum und Klasse über eine einheitliche Schnittstelle verwenden lassen. Vielen Dank für die ausführliche Erklärung.
https://stackoverflow.com/a/47784683
Es hat bereits verschiedene Versuche gegeben, Strukturen auf diese Weise auszudrücken, aber letztlich scheint das eine Grenze und zugleich ein Nachteil von Python zu sein. Mit ADT (algebraic data type) bin ich im Studium erstmals in einer OCaml-Vorlesung in Berührung gekommen; ein wenig schade ist es schon, dass man so etwas bei der Arbeit nur auf diese Weise nachahmen kann.
Die von ilotoki entwickelte Bibliothek dürfte wohl das Beispiel sein, das einem ADT am nächsten kommt. Es wäre schön, wenn sie irgendwann in die Standardbibliothek aufgenommen und breit genutzt würde.
Wenn die Implementierung von
Messageals Union erfolgt, kann man keine Methodenvererbung nutzen. Zum BeispielWenn man wie oben die Methode
.processhinzufügt, kann die Methode.process()für alle Varianten verwendet werden.Außerdem meinte ich mit dem von mir beschriebenen
reprdas „reprals Variante dieses Enums“.Wenn man zum Beispiel
reprauffieldenum-Weise umschlossen aufruft, wird es wie folgt ausgeführt.Ohne ein benutzerdefiniertes
__repr__wird nicht dargestellt, dass es sich um eine Untervariante desMessage-Enums handelt.Quitist eine Unit-Variante und wird ohne Aufruf verwendet.Außerdem kann man bei feldlosen Varianten, also Variantentypen, die per Aufruf verwendet werden müssen, als Singleton mit dem Operator
isprüfen.Mit
fieldenumlassen sich so verschiedene leicht zu übersehende Implementierungsdetails automatisch mit abdecken.Darf ich vielleicht vorschlagen, dass Sie dazu auf der PyCon Korea einen Vortrag halten? Ich fand das unglaublich spannend und würde die Geschichten und Erklärungen aus dem Entstehungsprozess gern direkt von Ihnen hören!
Es wäre wirklich eine Ehre, auf der PyCon einen Vortrag halten zu dürfen. Ich weiß allerdings nicht, ob das allein deshalb möglich ist, weil ich es gerne möchte (^^;), aber ich werde darüber nachdenken.
Außerdem wäre es schön, wenn im englischen README auch ein
Option-Beispiel erklärt würde.Optionist leicht verständlich und dürfte einen vertrauten, niedrigschwelligen Einstieg ermöglichen. Vielleicht wäre es in der Reihenfolge der Dokumentation sogar besser,Optionzuerst zu erklären.Die englische Dokumentation ist noch nicht fertig und daher etwas dürftig ... Sobald die koreanische Dokumentation ausreichend ausgereift ist, möchte ich sie ins Englische übersetzen. Oder entsprechende PRs sind ebenfalls willkommen!
Auch für mich wirkt es besser, zuerst
Optioneinzuführen. Ich werde das anpassen.Oh, interessant!!
Im Beispielcode der verlinkten koreanischen Dokumentation gibt es eine Korrektur.
Vielen Dank für den Hinweis. Ich habe es korrigiert!
Das hätte ich als Show GN posten sollen, aber ich habe es aus Versehen als normalen Beitrag eingestellt;;
Ich habe es korrigiert.
Vielen Dank~