C'est le deuxième d'une série de PEP que j'ai entendus pour la première fois lorsque je scannais le README du vérificateur de Microsoft pour Python pyright. Cette fois, j'écrirai sur PEP 612 (Variables de spécification des paramètres).
ParameterSpecificationAjoutez ParameterSpecification comme type qui représente l'argument.
La ParameterSpecification peut être utilisée en conjonction avec la Callable pour se comporter comme les génériques d'un objet appelable. Il est facile à comprendre si vous le considérez comme une version argument de TypeVar.
Dans l'exemple suivant, l'argument de ʻadd_logging () est de type Callable [Ps, R] , et la valeur de retour est également de type Callable [Ps, R] `. Autrement dit, il s'agit d'un décorateur qui renvoie une fonction avec la même interface que la fonction spécifiée en argument.
Par conséquent, foo () décoré avec @ add_logging reste de type (x: int, y: str) -> int.
from typing import Callable, ParameterSpecification, TypeVar
Ps = ParameterSpecification("Ps")
R = TypeVar("R")
def add_logging(f: Callable[Ps, R]) -> Callable[Ps, R]:
def inner(*args: Ps.args, **kwargs: Ps.kwargs) -> R:
log_to_database()
return f(*args, **kwargs)
return inner
@add_logging
def foo(x: int, y: str) -> int:
return x + 7
Il est difficile de taper ces décorateurs si le type ParameterSpecification n'est pas introduit.
ParameterSpecification.ParameterSpecification est un peu long, mais je ne pouvais penser à aucune alternative ...Recommended Posts