2013-03-04 11 views
19

Ho una classe definita come segueCome passare argomento argparse per funzionare come kwargs?

class M(object): 
    def __init__(self, **kwargs): 
     ...do_something 

e ho il risultato di argparse.parse_args(), ad esempio:

> args = parse_args() 
> print args 
Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever") 

voglio trasmettere i valori di questo spazio dei nomi (ad eccezione message_type) per creare un'istanza della classe M. Ho provato

M(args) 

ma ottenuto un errore

TypeError: __init__() takes exactly 1 argument (2 given) 

che non capisco. Come posso

  1. rimuovere il valore message_type dall'elenco nella args
  2. trasmettere i valori, come se mi digitare M(value=5, message='test', extra="blah", param="whatever") direttamente.

risposta

31

è necessario passare alla soluzione di vars(args) invece:

M(**vars(args)) 

I vars() function restituisce lo spazio dei nomi dell'istanza Namespace (il suo attributo __dict__) come un dizionario.

All'interno di M.__init__(), ignorare semplicemente la chiave message_type.

+1

Questo è esattamente ciò di cui ho bisogno. Grazie. Tranne per la rimozione di una determinata chiave. Ho bisogno che venga rimosso, non posso ignorarlo per ragioni che esulano dall'ambito di questa domanda. – Alex

+2

Suggerisco di fare 'arg_dict = dict ((k, v) per k, v in vars (args) .items() se k! =" Message_type ")' per evitare possibili comportamenti indefiniti con 'vars'. – Alex

+0

@Alex: quale comportamento indefinito con 'vars'? È possibile filtrare la chiave 'message_type' in questo modo, certo, ma farlo per il proprio interesse, non perché' vars() 'possa avere un comportamento indefinito (che non è così). –