[PYTHON] Ich habe PEP 614 (Lockerung der Grammatikbeschränkungen für Dekorateure) gelesen.
Neulich wurde PEP 614 (Lockerung der Grammatikbeschränkungen für Dekorateure) zu Final Commitment / python / peps / pull / 1437) Ich habe es gesehen.
Also werde ich diesmal PEP 614 lesen.
Überblick
- Bisher waren nur Namen mit dem Namen "gepunkteter Name" für Dekorateure verfügbar.
- Daher konnten "Ausdrücke" wie Array-Zugriff und Wörterbuchzugriff nicht für Dekorateure verwendet werden.
buttons = [QPushButton(f'Button {i}') for i in range(10)]
@buttons[0].clicked.connect # => NG
def spam():
...
- Erweitern Sie die Grammatik, um "Ausdrücke" in Dekorateuren zu akzeptieren
- Verfügbar ab Python 3.9.
Ansatz
Die Grammatik bisher
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
Es war
decorator: '@' namedexpr_test NEWLINE
Gewechselt zu. das ist alles.
Das ist schwer zu verstehen.
namedexpr_test
ist ein grammatikalisches Element, das auf einen Python-Ausdruck verweist.
Die Ausdrücke lauten wie folgt (aus 6. Ausdrücke - Python 3.8.3-Dokumentation).
- 6.1. Arithmetische Umrechnung
- 6.2. Atom, atomares Element (Atom)
- 6.2.1. Kennung (Kennung oder Name)
- 6.2.2. Wörtlich
- 6.2.3. Klammerform
- 6.2.4. Anzeige von Listen, Mengen und Wörterbüchern
- 6.2.5. Listenanzeige
- 6.2.6. Kollektive Anzeige
- 6.2.7. Wörterbuchanzeige
- 6.2.8. Generatortyp
- 6.2.9. Ertragsformel
- 6.2.9.1. Generator-Iterator-Methode
- 6.2.9.2. Verwendungsbeispiel
- 6.2.9.3. Asynchrone Generatorfunktion
- 6.2.9.4. Iteratormethode des asynchronen Generators
- 6.3. Primär
- 6.3.1. Siehe Attribute
- 6.3.2 Abonnement
- 6.3.3. Schneiden
- 6.3.4. Anruf
- 6.4. Warten Sie auf den Ausdruck
- 6.5. Netzbetreiber
- 6.6. Unäre arithmetische und bitweise Operation
- 6.7. Binäre arithmetische Operation
- 6.8. Schaltvorgang
- 6.9. Binäre bitweise Operation
- 6.10. Vergleich
- 6.10.1. Wertvergleich
- 6.10.2. Berechnung der Zugehörigkeitsprüfung
- 6.10.3. Identitätsvergleich
- 6.11. Boolesche Operation
- 6.12. Substitutionsformel
- 6.13. Bedingte Ausdrücke
- 6.14. Lambda
- 6.15. Liste der Ausdrücke
Es gibt verschiedene Dinge. Diese sind jetzt für Dekorateure verfügbar.
Bitte beachten Sie, dass einige Definitionen möglicherweise nicht verfügbar sind (z. B. Warten).
Beispiel
Versuchen Sie es mit einem Lambda-Ausdruck für den Dekorateur ...
>>> @lambda f: f
... def foo(): pass
...
Versuchen Sie es mit dem ternären Operator, wenn sonst ...
>>> x = lambda f: f
>>> y = lambda f: f
>>> @x if True else y
... def foo(): pass
...
Natürlich können Sie auch Arrays verwenden.
>>> deco = [lambda f: f]
>>> @deco[0]
... def foo(): pass
...
Impressionen
- Ich hatte bisher keine Probleme mit dotted_name, daher bin ich nicht so glücklich.
- Vielleicht gibt es etwas, worüber ich mich über das Dekorationsarrangement und das Wörterbuch freue ...?
- Sie müssen vorsichtig mit der Kapazitätsauslastung sein, da Sie sehr unangenehmen Code schreiben können.
>>> @x := staticmethod #Substitutionsformel(3.Ab 9)
... def foo(): pass
...