[PYTHON] J'ai lu PEP 612 (Variables de spécification des paramètres)

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

Aperçu

approche

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.

Exemple

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.

Impressions

Recommended Posts

J'ai lu PEP 612 (Variables de spécification des paramètres)
J'ai lu PEP 613 (alias de type explicite)
J'ai lu PEP 604 (syntaxe complémentaire pour Union []).
J'ai lu PEP 618 (Ajouter une vérification de longueur facultative à la fermeture éclair)
J'ai lu PEP 614 (Relaxing Grammar Restrictions on Decorators)
J'ai lu PEP-593 (fonction flexible et annotations variables)
J'ai lu PEP-544 (Protocoles: sous-typage structurel (typage statique du canard))
J'ai lu PEP 585 (Type Hinting Generics In Standard Collections)
J'ai lu l'algèbre linéaire de Strang
J'ai lu l'article de SHAP
J'ai lu PEP 560 (support de base pour le module de saisie et les types génériques)