【问题标题】:How to pass on argparse argument to function as kwargs?如何传递 argparse 参数以充当 kwargs?
【发布时间】:2013-02-18 19:17:39
【问题描述】:

我有一个类定义如下

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)

我不明白。我该怎么做

  1. args 的列表中删除值message_type
  2. 传递值,就像我直接输入 M(value=5, message='test', extra="blah", param="whatever") 一样。

【问题讨论】:

    标签: python python-2.7 arguments argparse


    【解决方案1】:

    您需要传入vars(args) 的结果:

    M(**vars(args))
    

    vars() function 以字典形式返回 Namespace 实例的命名空间(其 __dict__ 属性)。

    M.__init__() 中,只需忽略message_type 键即可。

    【讨论】:

    • 这正是我所需要的。谢谢。除了删除某个键。我需要删除它,我不能因为这个问题范围之外的原因而忽略它。
    • 我建议使用arg_dict = dict((k,v) for k,v in vars(args).items() if k!="message_type") 来避免vars 可能出现的未定义行为。
    • @Alex:vars 有什么未定义的行为?当然,您可以通过这种方式过滤掉 message_type 键,但这样做是为了它自己,而不是因为 vars() 可能有未定义的行为(它没有)。
    • @Alex:面对不支持的额外关键字参数,我宁愿让M 类更加健壮。
    • @Alex:这些值被复制M.__init__参数中,所以原始映射永远不会被修改。如果您需要规范传入的关键字,请改用白名单。
    猜你喜欢
    • 2020-06-30
    • 2016-05-09
    • 2013-11-30
    • 1970-01-01
    • 2012-04-09
    • 2022-12-31
    • 2016-02-16
    • 2016-04-28
    • 2016-09-08
    相关资源
    最近更新 更多