116 votes

Obtenir une liste/tuple/dict des arguments passés à une fonction ?

Etant donné la fonction suivante :

def foo(a, b, c):
    pass

Comment obtenir une liste/tuple/dict/etc des arguments passés, sans avoir à construire la structure moi-même ?

Plus précisément, je cherche la version Python de la fonction JavaScript arguments ou le mot-clé de PHP func_get_args() méthode.

Ce que je pas recherche une solution utilisant les *args o **kwargs Je dois spécifier les noms des arguments dans la définition de la fonction (pour m'assurer qu'ils sont bien transmis), mais à l'intérieur de la fonction, je veux travailler avec eux dans une structure de type liste ou dictée.

133voto

Pär Wieslander Points 11258

Vous pouvez utiliser locals() pour obtenir une liste des variables locales de votre fonction, comme ceci :

def foo(a, b, c):
    print locals()

>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}

Il s'agit toutefois d'un peu de bricolage, car locals() renvoie toutes les variables dans la portée locale, et pas seulement les arguments passés à la fonction. Par conséquent, si vous ne l'appelez pas au tout début de la fonction, le résultat peut contenir plus d'informations que vous ne le souhaitez :

def foo(a, b, c):
    x = 4
    y = 5
    print locals()

>>> foo(1, 2, 3)
{'y': 5, 'x': 4, 'c': 3, 'b': 2, 'a': 1}

Je préférerais construire un dict ou une liste des variables dont vous avez besoin au début de votre fonction, comme suggéré dans les autres réponses. C'est plus explicite et communique l'intention de votre code d'une manière plus claire, IMHO.

14voto

Esostack Points 517

Voici une fonction que vous pouvez appeler pour obtenir les kwargs de la fonction en cours. Ou si vous voulez utiliser ces lignes directement dans votre propre fonction au lieu d'appeler get_kwargs() il suffit d'enlever le .f_back

import inspect

def get_kwargs():
    frame = inspect.currentframe().f_back
    keys, _, _, values = inspect.getargvalues(frame)
    kwargs = {}
    for key in keys:
        if key != 'self':
            kwargs[key] = values[key]
    return kwargs

def test(x, y=100):
    z = 7
    print(get_kwargs())

test(5, 6)
# Output: {'x': 5, 'y': 6}
test(5)
# Output: {'x': 5, 'y': 100}

8voto

kroger Points 107

Vous pouvez utiliser le module d'inspection :

def foo(x):
    return x

inspect.getargspec(foo)
Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

Il s'agit d'un duplicata de este y este .

6voto

Xavier Combelle Points 3398

J'utiliserais *args o **kwargs et lève une exception si les arguments ne sont pas ceux attendus

Si vous voulez avoir les mêmes erreurs que celles vérifiées par python, vous pouvez faire quelque chose comme

def check_arguments(function_name,args,arg_names):
    missing_count = len(arg_names) - len(args)
    if missing_count > 0:
        if missing_count == 1:
            raise TypeError(function_name+"() missing 1 required positionnal argument: "+repr(arg_names[-1]))
        else:
            raise TypeError(function_name+"() missing "+str(missing_count)+" required positionnal argument: "+", ".join([repr(name) for name in arg_names][-missing_count:-1])+ " and "+repr(arg_names[-1]))

en utilisant quelque chose comme

def f(*args):
    check_arguments("f",args,["a","b","c"])
    #whatever you want
    ...

4voto

lib Points 378

Extrait de la réponse acceptée à une question identique (plus ancienne ??) https://stackoverflow.com/a/582206/1136458 :

    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X