Topic de ProMasqueEtFier :

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

  • 1
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

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.
  • 1

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
En ligne sur JvArchive 229