2009-02-24 18 views

risposta

122

Se si desidera che anche i valori è possibile utilizzare il modulo 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

[Kelly Yancey's blog] (http://kbyanc.blogspot.com/2007 /07/python-aggregating-function-arguments.html) ha un ottimo post che lo spiega dettagliatamente e fornisce una versione leggermente più raffinata, con un confronto con, ad esempio la soluzione sconosciuta. Consigliato. –

+0

cosa dire di 'def foo (primo, secondo, terzo, * therest):'? – MeadowMuffins

144

locals() (Documenti per Python 2, Python 3) restituisce un dizionario con nomi locali:

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

Stampa l'elenco dei parametri. Se si utilizzano altre variabili locali, queste saranno incluse in questo elenco. Ma potresti fare una copia all'inizio della tua funzione.

+2

'print locals(). Keys()' restituirà '['arg']'. Ho usato 'print locals.get ('arg')' – Droogans

+0

@Droogans si prega di controllare di nuovo. La soluzione di @unbeknown stampa '['a', 'b', 'c']' (probabilmente non nell'ordine a-b-c), come previsto. La tua soluzione (a) non funziona, solleva un 'AttributeError' - forse intendevi 'print locals(). Get (' arg ')'? e (b) se è quello che stavi cercando di fare, che stampa il valore del parametro, non il nome del parametro come l'OP richiesto. –

+8

Grazie! Ho un nuovo amore per '" trovato {thing} in {place}, preso {action}, risultante in {result} ". Format (** locals())' invece di '" found {thing} in {place} , preso {action}, risultante in {result} ". format (thing = thing, place = place, action = action, result = result)' –

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

Non è all'interno della funzione .. –

+11

puoi farlo anche all'interno della funzione – Oli

+4

questo è effettivamente meglio, poiché mostra come ottenere parametri di metodo che non hai scritto tu stesso. – Dannid

188

Bene, noi in realtà non hanno bisogno di inspect qui.

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

Per Python 2.5 e più anziani, utilizzare func_code invece di __code__, e func_defaults invece di __defaults__.

+10

che sarebbe 'func.func_code.co_varnames [: func.func_code.co_argcount]' dato che co_varnames è una tupla di tutte le variabili presenti nella funzione – squirrel

+18

In python3 questo sarebbe func .__ code __. Co_varnames – michaelJohn

+0

Grazie mille @mikeschuldt , dovresti aggiungere una risposta da solo per python3 per la visibilità – Kethryweryn

Problemi correlati