2014-10-21 5 views
7

Ich weiß, ich kann Funktionsargumente in ein Wörterbuch umwandeln, wenn die Funktion **kwargs übernimmt.packen benannte Argumente in ein dict

def bar(**kwargs): 
    return kwargs 

print bar(a=1, b=2) 
{'a': 1, 'b': 2} 

Allerdings ist das Gegenteil wahr? Kann ich pack benannte Argumente in ein Wörterbuch eingeben und sie zurückgeben? Die handkodierte Version sieht so aus:

def foo(a, b): 
    return {'a': a, 'b': b} 

Aber es scheint, dass es einen besseren Weg geben muss. Beachten Sie, dass ich versuche, **kwargs in der Funktion zu vermeiden (benannte Argumente funktionieren besser für eine IDE mit Codevervollständigung).

+0

'Einheimischen zurückkehren()', wenn Sie keine anderen Variablen im Code haben –

+0

[diese] (http: // Stackoverflow .com/a/582206/432913) Antwort auf die gleiche Frage hat einen Kommentar unter dem Link zu [this] (http://kbyanc.blogspot.co.uk/2007/07/python-aggregating-function-arguments.html) Blog-Post, der tut, was Sie wollen, und kümmert sich oder eine Randfälle, die iCodez die Antwort vermisst. – will

Antwort

9

Es klingt wie Sie für locals suchen:

>>> def foo(a, b): 
...  return locals() 
... 
>>> foo(1, 2) 
{'b': 2, 'a': 1} 
>>> def foo(a, b, c, d, e): 
...  return locals() 
... 
>>> foo(1, 2, 3, 4, 5) 
{'c': 3, 'b': 2, 'a': 1, 'e': 5, 'd': 4} 
>>> 

ist jedoch zu beachten, dass dies ein Wörterbuch der alle Namen zurück, die im Rahmen von foo sind:

>>> def foo(a, b): 
...  x = 3 
...  return locals() 
... 
>>> foo(1, 2) 
{'b': 2, 'a': 1, 'x': 3} 
>>> 

Diese shouldn Wenn Ihre Funktionen denen in Ihrer Frage entsprechen, ist das kein Problem. Wenn es jedoch ist, können Sie inspect.getfullargspec verwenden und ein dictionary comprehensionlocals() zu filtern:

>>> def foo(a, b): 
...  import inspect # 'inspect' is a local name 
...  x = 3   # 'x' is another local name 
...  args = inspect.getfullargspec(foo).args 
...  return {k:v for k,v in locals().items() if k in args} 
... 
>>> foo(1, 2) # Only the argument names are returned 
{'b': 2, 'a': 1} 
>>> 
+0

Danke für den Haftungsausschluss; Ich suche nach dieser Funktionalität innerhalb einer Klasse, also mache ich die Methode statisch. – Felix