J'ai lu PEP 614 (Relaxing Grammar Restrictions on Decorators)
L'autre jour, PEP 614 (Relaxing Grammar Restrictions On Decorators) est devenu Final Commitment / python / peps / pull / 1437) Je l'ai vu.
Donc, cette fois, je lirai PEP 614.
Aperçu
- Jusqu'à présent, seuls les noms avec «.» Appelé «dotted_name» étaient disponibles pour les décorateurs.
- Par conséquent, les "expressions" telles que l'accès au tableau et l'accès au dictionnaire ne peuvent pas être utilisées pour les décorateurs.
buttons = [QPushButton(f'Button {i}') for i in range(10)]
@buttons[0].clicked.connect # => NG
def spam():
...
- Étendre la grammaire pour accepter les "expressions" dans les décorateurs
- Disponible depuis Python 3.9.
approche
La grammaire jusqu'à présent
decorator: '@' dotted_name [ '(' [arglist] ')' ] NEWLINE
C'était
decorator: '@' namedexpr_test NEWLINE
Changé en. c'est tout.
C'est difficile à comprendre.
namedexpr_test
est un élément grammatical qui pointe vers une expression Python.
Les expressions sont les suivantes (tirées de 6. Expressions - Documentation Python 3.8.3).
- 6.1. Conversion arithmétique
- 6.2. Atome, élément atomique (atome)
- 6.2.1. Identifiant (identifiant ou nom)
- 6.2.2. Littéral
- 6.2.3. Forme entre parenthèses
- 6.2.4. Affichage des listes, ensembles et dictionnaires
- 6.2.5. Affichage de la liste
- 6.2.6. Affichage collectif
- 6.2.7. Affichage du dictionnaire
- 6.2.8. Type de générateur
- 6.2.9. Formule de rendement
- 6.2.9.1. Méthode générateur-itérateur
- 6.2.9.2. Exemple d'utilisation
- 6.2.9.3. Fonction de générateur asynchrone
- 6.2.9.4. Méthode d'itération de générateur asynchrone
- 6.3. Primaire
- 6.3.1. Voir les attributs
- 6.3.2. Abonnement
- 6.3.3. Tranchage
- 6.3.4. Appel
- 6.4. Attendre l'expression
- 6.5. Opérateur électrique
- 6.6. Opération arithmétique unaire et bit à bit
- 6.7. Opération arithmétique binaire
- 6.8. Opération de changement de vitesse
- 6.9. Opération binaire bit à bit
- 6.10. Comparaison
- 6.10.1. Comparaison des valeurs
- 6.10.2. Calcul de l'inspection d'affiliation
- 6.10.3. Comparaison d'identité
- 6.11. Opération booléenne
- 6.12. Formule de substitution
- 6.13. Expressions conditionnelles
- 6.14. Lambda
- 6.15. Liste des expressions
Il y a plusieurs choses. Ceux-ci sont maintenant disponibles pour les décorateurs.
Veuillez noter que certaines définitions ne peuvent pas être utilisées (comme attendre).
Exemple
Essayez d'utiliser une expression lambda pour le décorateur ...
>>> @lambda f: f
... def foo(): pass
...
Essayez d'utiliser l'opérateur ternaire sinon ...
>>> x = lambda f: f
>>> y = lambda f: f
>>> @x if True else y
... def foo(): pass
...
Bien sûr, vous pouvez également utiliser des tableaux.
>>> deco = [lambda f: f]
>>> @deco[0]
... def foo(): pass
...
Impressions
- Je n'ai eu aucun problème avec dotted_name jusqu'à présent, donc je ne suis pas si content.
- Peut-être qu'il y a quelque chose dont je suis content avec l'arrangement et le dictionnaire du décorateur ...
- Faites attention à l'utilisation de la capacité, car vous pouvez écrire du code très désagréable.
>>> @x := staticmethod #Formule de substitution(3.À partir de 9)
... def foo(): pass
...