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
  ...