1

这是我的一堂课:

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_somethingkwargs 中的值,但情况会更糟,因为我弄乱了删除有用信息的签名......

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

我在 python 2.6

4

1 回答 1

3

它是Python 3 中的新功能。Python 2 中最好的解决方法是

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

您看到的行为发生是因为 Python 试图巧妙地匹配参数,因此例如,如果您传递太多位置参数,它将使关键字参数成为位置参数。

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

于 2012-12-03T16:06:09.380 回答