Définition du type d'argument de fonction en python

Il fut un temps où je voulais définir un type en python, alors j'ai écrit un décorateur de fonction pour le moment Si on me disait d'utiliser cython, je n'aurais pas d'enfants, mais ...

type_definiton.py


from inspect import getargspec, getcallargs


def type_definition(*types):
    def type_checker(func):
        argspec = getargspec(func)

        arg_length = len(argspec.args)

        kwargs_index = -1 if argspec.keywords else 0
        vargs_index = -1 + kwargs_index if argspec.varargs else 0

        arg_type = zip(argspec.args, types[:arg_length])
        vargs_type = types[vargs_index] if vargs_index else None
        kwargs_type = types[kwargs_index] if kwargs_index else None

        def new_func(*args, **kwargs):
            argdetail = getcallargs(func, *args, **kwargs)

            # check type of args
            for name, _type in arg_type:
                if name in argdetail:
                    if not type(argdetail[name]) == _type:
                        raise ValueError(
                           "Invalid Type: " + name + " is not " + str(_type)
                            )

            if vargs_type:
                for value in argdetail[argspec.varargs]:
                    if not type(value) == vargs_type:
                        raise ValueError(
                           "Invalid Type: " + argspec.varargs \
                             + " is not " + str(vargs_type)
                           )

            if kwargs_type:
                for value in argdetail[argspec.keywords].values():
                    if not type(value) == kwargs_type:
                        raise ValueError(
                           "Invalid Type: " + argspec.keywords \
                             + " is not " + str(kwargs_type)
                           )

            # do func
            return func(*args, **kwargs)

        return new_func
    return type_checker

J'écrirai un exemple d'utilisation

example.py


@type_definition(int, int, str)
def foo(a, b, c=0):
    return a + b + int(c)

foo(1, 1)
# -> 2
foo(1, 1, 1)
# ValueError: Invalid Type: c is not <type 'str'>
foo(1, 1, "1")
# -> 3


Recommended Posts

Définition du type d'argument de fonction en python
Résumé des arguments de la fonction Python
Premier python (type de données, instruction de contrôle, définition de fonction)
Créer une fonction en Python
Utiliser la fonction de rappel en Python
Fonction ntile (décile) en python
Modélisation de fonctions non linéaires en Python
Dessiner la fonction Yin en python
Fonction immédiate (lie) en python
Technique pratique pour passer des arguments en Python (taple, type dictionnaire)
[python] Fonction de rappel (passez la fonction en argument)
Implémenter la fonction power.prop.test de R en python
fonction python ①
Notation inclusive dans l'argument de la fonction Python
[Python] fonction
Ecrire une fonction AWS Lambda en Python
Charger dynamiquement les types json avec python
Mesurer le temps d'exécution de la fonction en Python
Remarque: Signification de spécifier uniquement * (astérisque) comme argument dans la définition de fonction de Python
Type spécifié en python. Lancer des exceptions
Synthèse de fonctions et application en Python
fonction python ②
Précautions lors du décapage d'une fonction en python
[Introduction à l'application Udemy Python3 +] 48. Définition des fonctions
Prenez la somme logique de List en Python (fonction zip)
Tapez les annotations pour Python2 dans les fichiers stub!
forme élémentaire fixe de type csv générée par python
Ecrire une courte définition de propriété en Python
Quadtree en Python --2
Python en optimisation
CURL en Python
Géocodage en python
SendKeys en Python
Type numérique Python
fonction d'énumération python
Méta-analyse en Python
Unittest en Python
Python> fonction> Fermeture
Époque en Python
Discord en Python
[Python] Fonction de générateur
Allemand en Python
DCI en Python
tri rapide en python
nCr en python
N-Gram en Python
Programmation avec Python
Plink en Python
Constante en Python
FizzBuzz en Python
Sqlite en Python
Étape AIC en Python
LINE-Bot [0] en Python
Python> fonction> Fonction interne
CSV en Python
Assemblage inversé avec Python