2009-02-24 5 views

Antwort

122

Wenn Sie auch die Werte wollen, können Sie das inspect Modul verwenden

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 Yanceys Blog] (http://kbyanc.blogspot.com/2007 /07/python-aggregating-function-arguments.html) hat einen tollen Beitrag, der das im Detail erklärt und eine etwas verfeinerte Version gibt, plos einen Vergleich mit, zB Unbekannte Lösung. Empfohlen. –

+0

Was ist mit 'def foo (erster, zweiter, dritter, * am meisten):'? – MeadowMuffins

144

locals() (docs für Python 2, Python 3) gibt einen Wörterbuch mit dem lokalen Namen:

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

druckt die Liste der Parameter. Wenn Sie andere lokale Variablen verwenden, werden diese in diese Liste aufgenommen. Aber Sie könnten eine Kopie zu Beginn Ihrer Funktion machen.

+2

'print local(). Keys()' gibt '[' arg '] 'zurück. Ich habe 'print locals.get ('arg')' – Droogans

+0

@Droogans verwendet, bitte überprüfen Sie noch einmal. Die Lösung von @unbeknown druckt '['a', 'b', 'c']' (möglicherweise nicht in der Reihenfolge a-b-c) wie erwartet. Deine Lösung (a) funktioniert nicht, löst einen 'AttributError' aus - vielleicht meintest du' print local(). Get ('arg') '? und (b) wenn Sie das versuchen, wird der Wert des Parameters ausgegeben, nicht der Name des Parameters, wie vom OP angefordert. –

+8

Danke! Ich habe eine neue Liebe für "gefunden {thing} in {place}, nahm {action}, resultierte in {result}". Format (** locals()) 'anstelle von' "find {thing} in {place} , nahm {action}, resultierte in {result} ". format (thing = ding, platz = platz, aktion = aktion, ergebnis = ergebnis)' –

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

Das ist nicht in der funktion .. –

+11

kann man es auch innerhalb der funktion tun – Oli

+4

das ist eigentlich besser, da es zeigt, wie man auf Parameter der Methode kommt, die du selbst nicht geschrieben hast. – Dannid

188

Nun, wir eigentlich nicht inspect hier brauchen.

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

für Python 2.5 und älter, verwenden func_code statt __code__ und func_defaults statt __defaults__.

+10

das wäre 'func.func_code.co_varnames [: func.func_code.co_argcount]' da co_varnames ist ein Tupel aller in der Funktion vorhandenen Variablen – squirrel

+18

In python3 wäre das func .__ code __. Co_varnames – michaelJohn

+0

Vielen Dank @mikeschuldt , sollten Sie eine Antwort für python3 für Sichtbarkeit hinzufügen – Kethryweryn