Python可选,位置和关键字参数

时间:2012-12-03 16:01:04

标签: python optional-arguments keyword-argument

这是我的课程:

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)

但这对我来说并不合适。我也可以检查kwargs中的do_something值,但是会更糟,因为我弄乱了删除有用信息的签名......

python中有没有办法安全地使用可选,位置和关键字参数? 如果没有其他更简单的解决方法?

我正在使用python 2.6

1 个答案:

答案 0 :(得分:3)

这是new in Python 3。 Python 2中最好的解决方法是

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

你看到的行为发生是因为Python试图在匹配参数方面很聪明,所以例如如果传递过多的位置参数,它会使关键字参数成为位置。

PS为什么不将它存储为metadict的属性而不是作为dict中的条目?