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

  buttons = [QPushButton(f'Button {i}') for i in range(10)]

  @buttons[0].clicked.connect  # => NG
  def spam():
      ...

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

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

  >>> @x := staticmethod  #Formule de substitution(3.À partir de 9)
  ... def foo(): pass
  ...

Recommended Posts

J'ai lu PEP 614 (Relaxing Grammar Restrictions on Decorators)
J'ai lu PEP 613 (alias de type explicite)
J'ai lu PEP 612 (Variables de spécification des paramètres)
J'ai lu PEP 604 (syntaxe complémentaire pour Union []).
J'ai lu PEP-362 (objet de signature de fonction)
J'ai lu PEP 618 (Ajouter une vérification de longueur facultative à la fermeture éclair)
J'ai lu PEP 584 (Add Union Operators To dict)
J'ai lu PEP-593 (fonction flexible et annotations variables)
J'ai lu un livre d'introduction sur le traitement du langage naturel
J'ai lu PEP-544 (Protocoles: sous-typage structurel (typage statique du canard))
J'ai lu PEP 585 (Type Hinting Generics In Standard Collections)