2009-02-24 8 views

Répondre

122

Si vous voulez aussi les valeurs que vous pouvez utiliser le module inspect

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)] 
+9

[le blog de Kelly Yancey] (http://kbyanc.blogspot.com/2007 /07/python-aggregating-function-arguments.html) a un excellent post expliquant cela en détail et donnant une version légèrement plus raffinée, avec laquelle on peut comparer, par exemple la solution d'unbeknown. Conseillé. –

+0

qu'en est-il de 'def foo (premier, deuxième, troisième, * therest):'? – MeadowMuffins

144

locals() (docs pour Python 2, Python 3) retourne un dictionnaire avec des noms locaux:

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

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

+2

'print locals(). Keys()' retournera '['arg']'. J'ai utilisé 'print locals.get ('arg')' – Droogans

+0

@Droogans s'il vous plaît vérifier à nouveau. La solution de @unbeknown imprime '['a', 'b', 'c']' (probablement pas dans l'ordre a-b-c), comme prévu. Votre solution (a) ne fonctionne pas, soulève un 'AttributeError' - peut-être que vous vouliez dire' print locals(). Get ('arg') '? et (b) si c'est ce que vous essayiez de faire, cela imprime la valeur du paramètre, pas le nom du paramètre comme demandé par l'OP. –

+8

Merci! J'ai un nouvel amour pour '" trouvé {thing} dans {lieu}, a pris {action}, résultant en {result} ". Format (** locals())' au lieu de '" found {thing} en {place} , a pris {action}, résultant en {résultat} ". format (chose = chose, lieu = lieu, action = action, résultat = résultat)' –

74
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

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

+11

vous pouvez le faire à l'intérieur de la fonction aussi – Oli

+4

c'est en fait mieux, car cela montre comment obtenir les paramètres de la méthode que vous n'avez pas écrite vous-même. – Dannid

188

Eh bien, nous ne ont 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__ et func_defaults au lieu de __defaults__.

+10

qui 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 – squirrel

+18

En python3 ce serait func .__ code __. Co_varnames – michaelJohn

+0

Merci beaucoup @mikeschuldt , vous devriez ajouter une réponse sur votre propre pour python3 pour la visibilité – Kethryweryn

Questions connexes