386 votes

Obtenir la liste des noms de paramètres dans une fonction python

Duplicata possible :
Obtenir les noms des paramètres des méthodes en python

Existe-t-il un moyen simple de se trouver à l'intérieur d'une fonction python et d'obtenir une liste des noms des paramètres ?

Par exemple :

def func(a,b,c):
    print magic_that_does_what_I_want()

>>> func()
['a','b','c']

Gracias

478voto

simplyharsh Points 11663

Eh bien, nous n'avons pas vraiment besoin inspect ici.

>>> func = lambda x, y: (x, y)
>>> 
>>> func.__code__.co_argcount
2
>>> func.__code__.co_varnames
('x', 'y')
>>>
>>> def func2(x,y=3):
...  print(func2.__code__.co_varnames)
...  pass # Other things
... 
>>> func2(3,3)
('x', 'y')
>>> 
>>> func2.__defaults__
(3,)

Pour Python 2.5 et plus, utilisez func_code au lieu de __code__ y func_defaults au lieu de __defaults__ .

47 votes

Ce serait func.func_code.co_varnames[:func.func_code.co_argcount] puisque co_varnames est un tuple de toutes les variables présentes dans la fonction

32 votes

En python3, ce serait func.__code__.co_varnames

2 votes

Cela ne fonctionne que pour les fonctions ou les méthodes non intégrées.

295voto

locals() renvoie un dictionnaire avec les noms locaux :

def func(a,b,c):
    print(locals().keys())

imprime la liste des paramètres. Si vous utilisez d'autres variables locales, elles seront incluses dans cette liste. Mais vous pouvez en faire une copie au début de votre fonction.

192voto

kmkaplan Points 10338

Si vous souhaitez également obtenir les valeurs, vous pouvez utiliser la fonction inspect module

import inspect

def func(a, b, c):
    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
    print 'function name "%s"' % inspect.getframeinfo(frame)[2]
    for i in args:
        print "    %s = %s" % (i, values[i])
    return [(i, values[i]) for i in args]

>>> func(1, 2, 3)
function name "func"
    a = 1
    b = 2
    c = 3
[('a', 1), ('b', 2), ('c', 3)]

14 votes

Le blog de Kelly Yancey a un excellent billet expliquant cela en détail et donnant une version légèrement plus raffinée, plos une comparaison avec, par exemple, la solution de unbeknown. Recommandé.

0 votes

Qu'en est-il def foo(first, second, third, *therest): ?

152voto

Oli Points 5620
import inspect

def func(a,b,c=5):
    pass

inspect.getargspec(func)  # inspect.signature(func) in Python 3

(['a', 'b', 'c'], None, None, (5,))

1 votes

Ce n'est pas à l'intérieur de la fonction..

15 votes

Vous pouvez aussi le faire à l'intérieur de la fonction

12 votes

C'est en fait mieux, car cela montre comment obtenir les paramètres d'une méthode que vous n'avez pas écrite vous-même.

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