How to pass on argparse argument to function as kwargs?
13,584
You need to pass in the result of vars(args)
instead:
M(**vars(args))
The vars()
function returns the namespace of the Namespace instance (its __dict__
attribute) as a dictionary.
Inside M.__init__()
, simply ignore the message_type
key.
Author by
Alex
Updated on June 18, 2022Comments
-
Alex almost 2 years
I have a class defined as follows
class M(object): def __init__(self, **kwargs): ...do_something
and I have the result of
argparse.parse_args()
, for example:> args = parse_args() > print args Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever")
I want to pass on the values of this namespace (except
message_type
) to create an instance of the classM
. I have triedM(args)
but got an error
TypeError: __init__() takes exactly 1 argument (2 given)
which I do not understand. How can I
- remove the value
message_type
from the list inargs
- pass on the values as if I would type
M(value=5, message='test', extra="blah", param="whatever")
directly.
- remove the value
-
Alex about 11 yearsThats exactly what I need. Thanks. Except for removal of the certain key. I need it to be removed, I cannot just ignore it for reasons outside the scope of this question.
-
Alex about 11 yearsI suggest to do
arg_dict = dict((k,v) for k,v in vars(args).items() if k!="message_type")
to avoid possible undefined behaviour withvars
. -
Martijn Pieters about 11 years@Alex: what undefined behaviour with
vars
? You can filter out themessage_type
key that way, sure, but do that for it's own sake, not becausevars()
might have undefined behaviour (which it doesn't). -
Martijn Pieters about 11 years@Alex: I'd rather make the
M
class more robust in the face of extra keyword arguments it doesn't support. -
Alex about 11 yearsNote From the documentation of vars:
The returned dictionary should not be modified: the effects on the corresponding symbol table are undefined. [2]
. As for your suggestion,M
can be one of many classes absolutely detached from what I am doing here. These classes cannot possibly know of some abundant keyword (and might give an error otherwise). Let's say, those classes cannot be modified. -
Martijn Pieters about 11 years@Alex: The values are copied into the
M.__init__
parameters, so the original mapping is never modified. If you need to regulate what keywords are passed in, use a whitelist instead.