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