Topic de ProMasqueEtFier :

[PYTHON] Un décorateur pour typer ses arguments de fonction

def signature(*types):
    def get_function(f):
        def typed_f(*args):
            casted_args = []
            for a,t in zip(args, types):
                try:
                    casted_args.append(t(a))
                except ValueError:
                    raise Exception("Expected type '{}' got '{}'".format(t, type(a)))
            return f(*casted_args)
        return typed_f
    return get_function

@signature(float, float) # Utilisation
def f(a, b):
    return a+b

https://image.noelshack.com/fichiers/2019/43/6/1572110955-20191026-003919.png

Répondez pas surtout https://image.noelshack.com/fichiers/2021/07/4/1613639007-risichauve.png

Tu devrais décorer ta fonction typed_f avec le décorateur wraps pour avoir accès à tous les attributs de ta fonction d'origine comme par exemple la docstring :

from functools import wraps

def signature(*types):
    def get_function(f):
        @wraps(f)
        def typed_f(*args):
            casted_args = []
            for a,t in zip(args, types):
                try:
                    casted_args.append(t(a))
                except ValueError:
                    raise Exception("Expected type '{}' got '{}'".format(t, type(a)))
            return f(*casted_args)
        return typed_f
    return get_function

La fonction avec une docstring:

@signature(float, float) # Utilisation
def f(a, b):
    """Retourne la somme de deux nombres."""
    return a+b

Sans wraps :

>>> help(f)
Help on function typed_f in module __main__:

typed_f(*args)

Avec wraps:

>>> help(f)
Help on function f in module __main__:

f(a, b)
    Fonction qui retourne la somme de deux nombres.

Données du topic

Auteur
ProMasqueEtFier
Date de création
23 mars 2021 à 01:31:56
Nb. messages archivés
4
Nb. messages JVC
4
Voir le topic sur JVC

Afficher uniquement les messages de l'auteur du topic

En ligne sur JvArchive
JvArchive compagnon
Découvrez JvArchive compagnon, l'userscript combattant la censure abusive sur le 18-25 !