Python的可选的,位置和关键字参数(Python optional, positional an

2019-10-17 11:00发布

这是一类我有:

class metadict(dict):
    def __init__(self, do_something=False, *args, **kwargs)
        if do_something:
            pass
        super(metadict,self).__init__(*args,**kwargs)

我们的想法是封装了字典,并使用一个特殊的关键字添加一些功能。 该字典仍然可以持有do_something虽然你不能在创建时添加。 对于所有其他方面它的行为就像一个正常的字典。

无论如何,问题是,无论我给args它开始通过指定的第一个值来do_something这是不是我想要的。

我现在做的是这样的:

class metadict(dict):
    def __init__(self, do_something=False, *args, **kwargs)
        if not isinstance(do_something, bool):
            args = list(args)
            args.append(do_something)
        elif do_something:
            pass
        super(metadict,self).__init__(*args,**kwargs)

但它不看我的权利。 我也可以检查的do_something在kwargs价值,但它会更糟糕,因为有签名删除有用的信息,我一塌糊涂...

是否有蟒蛇任何方式安全地使用可选的位置和关键字参数? 如果不是有其他的解决方法更简单?

我在Python 2.6中

Answer 1:

这是在Python 3新 。 在Python 2最好的解决方法是

def foo(*args, **kwargs):
    do_something = kwargs.pop("do_something", False)

您所看到的行为发生,因为Python的尝试是在匹配了参数聪明,所以例如它会让一个关键字参数位置,如果你通过了太多的位置参数。

PS为什么不将其存储为一个属性metadict而不是作为在字典中的条目?



文章来源: Python optional, positional and keyword arguments