2009-02-24 12 views

Respuesta

122

Si también desea que los valores que puede utilizar el módulo 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

[Blog de Kelly Yancey] (http://kbyanc.blogspot.com/2007 /07/python-aggregating-function-arguments.html) tiene una gran publicación explicando esto en detalle y dando una versión un poco más refinada, plos una comparación con, por ejemplo la solución desconocida. Recomendado. –

+0

¿qué pasa con 'def foo (primero, segundo, tercero, * más):'? – MeadowMuffins

144

locals() (docs para Python 2, Python 3) devuelve un diccionario con los nombres locales:

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

imprime la lista de parámetros. Si usa otras variables locales, éstas se incluirán en esta lista. Pero podría hacer una copia al comienzo de su función.

+2

'print locals(). Keys()' devolverá '['arg']'. Utilicé 'print locals.get ('arg')' – Droogans

+0

@Droogans, compruebe de nuevo. La solución de @unbeknown imprime '['a', 'b', 'c']' (posiblemente no en orden a-b-c), como se esperaba. Su solución (a) no funciona, genera un 'AttributeError' - quizás quiso decir' print locals(). Get ('arg') '? y (b) si eso es lo que intentaba hacer, imprime el valor del parámetro, no el nombre del parámetro como solicitó el OP. –

+8

¡Gracias! Tengo un nuevo amor por '" encontrado {cosa} en {lugar}, tomó {acción}, lo que resulta en {resultado} ". Formato (** locales())' en lugar de '" encontrado {cosa} en {lugar} , tomó {acción}, dando como resultado {resultado} "formato (cosa = cosa, lugar = lugar, acción = acción, resultado = resultado)' –

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

Eso no está dentro de la función .. –

+11

puede hacerlo dentro de la función también – Oli

+4

esto es realmente mejor, ya que muestra cómo obtener los parámetros del método que no escribió usted mismo. – Dannid

188

Bueno, en realidad no necesita inspect aquí.

>>> 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,) 

Para Python 2,5 y mayores, utilizar func_code en lugar de __code__, y func_defaults en lugar de __defaults__.

+10

que sería 'func.func_code.co_varnames [: func.func_code.co_argcount]' dado que co_varnames es una tupla de todas las variables presentes en la función – squirrel

+18

En python3 esto sería func .__ code __. Co_varnames – michaelJohn

+0

Muchas gracias @mikeschuldt , debe agregar una respuesta por su cuenta para python3 para visibilidad – Kethryweryn

Cuestiones relacionadas