2014-10-21 11 views
7

So che posso trasformare argomenti di funzione in un dizionario se la funzione accetta **kwargs.imballaggio argomenti denominati in un dict

def bar(**kwargs): 
    return kwargs 

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

Tuttavia, è vero il contrario? Posso aggiungere gli argomenti denominati in un dizionario e restituirli? La versione codificata a mano assomiglia a questa:

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

Ma sembra che ci debba essere un modo migliore. Si noti che sto cercando di evitare l'uso di **kwargs nella funzione (gli argomenti denominati funzionano meglio per un IDE con il completamento del codice).

+0

'locals tornare()' una volta che non si dispone di tutte le altre variabili nel codice –

+0

[questo] (http: // StackOverflow .com/a/582206/432913) la risposta alla stessa domanda ha un commento sotto il collegamento a [questo] (http://kbyanc.blogspot.co.uk/2007/07/python-aggregating-function-arguments.html) post di blog, che fa quello che vuoi, e si prende cura di un caso limite che manca la risposta di iCodez. – will

risposta

9

Sembra che si sta cercando locals:

>>> 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} 
>>> 

noti comunque che questo restituirà un dizionario di tutti nomi che rientrano nell'ambito di applicazione del foo:

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

Questo shouldn essere un problema se le tue funzioni sono come quelle date nella tua domanda. Se si tratta invece, è possibile utilizzare inspect.getfullargspec e un dictionary comprehension di filtrare locals():

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

Grazie per il disclaimer; Sto cercando questa funzionalità all'interno di una classe, quindi sto rendendo il metodo statico. – Felix

Problemi correlati