2013-03-04 10 views
19

Mam klasy zdefiniowane następującoJak przekazać argument argparse do funkcji kwargs?

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

i mam wynik argparse.parse_args(), na przykład:

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

Chcę przekazać na wartościach tej przestrzeni nazw (z wyjątkiem message_type), aby utworzyć instancja klasy M. Próbowałem

M(args) 

ale masz błąd

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

których ja nie rozumiem. Jak mogę

  1. usunąć wartość message_type z listy w args
  2. przejściu na wartościach jak gdybym wpisać M(value=5, message='test', extra="blah", param="whatever") bezpośrednio.

Odpowiedz

31

Trzeba zdać w wyniku vars(args) Zamiast:

M(**vars(args)) 

W vars() function powraca przestrzeń nazw instancji Namespace (jego atrybut __dict__) jako słownika.

Wewnątrz M.__init__(), po prostu zignoruj ​​klucz message_type.

+1

To jest dokładnie to, czego potrzebuję. Dzięki. Z wyjątkiem usunięcia określonego klucza. Potrzebuję go do usunięcia, nie mogę po prostu zignorować go z powodów wykraczających poza zakres tego pytania. – Alex

+2

Proponuję zrobić 'arg_dict = dict ((k, v) dla k, v w vars (args) .items(), jeśli k! =" Message_type ")', aby uniknąć możliwego niezdefiniowanego zachowania z 'vars'. – Alex

+0

@Alex: jakie niezdefiniowane zachowanie z 'vars'? Możesz odfiltrować w ten sposób klucz 'message_type', oczywiście, ale rób to dla niego samego, nie dlatego, że' vars() 'może mieć niezdefiniowane zachowanie (którego nie ma). –