我有一个定义如下的类
class M(object):
def __init__(self, **kwargs):
...do_something
我有一个argparse.parse_args()
的结果,例如:
> args = parse_args()
> print args
Namespace(value=5, message='test', message_type='email', extra="blah", param="whatever")
我希望传递此命名空间的值(除了message_type
)以创建类M
的实例。我尝试过:
M(args)
但是遇到了一个错误
TypeError: __init__() takes exactly 1 argument (2 given)
我不理解。我如何:
- 从
args
列表中删除message_type
值? - 将值传递,就像我直接键入
M(value=5, message='test', extra="blah", param="whatever")
一样。
arg_dict = dict((k,v) for k,v in vars(args).items() if k!="message_type")
来避免在使用vars
时可能出现的未定义行为。 - Alexvars
有什么未定义行为?你可以通过这种方式过滤掉message_type
键,但这样做是为了自己的利益,而不是因为vars()
可能具有未定义的行为(它并没有)。 - Martijn PietersM
类在面对它不支持的额外关键字参数时更加健壮。 - Martijn PietersM.__init__
参数中,因此原始映射永远不会被修改。如果您需要控制传递的关键字,请使用白名单。 - Martijn Pieters