这是我的课程:
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
答案 0 :(得分:3)
这是new in Python 3。 Python 2中最好的解决方法是
def foo(*args, **kwargs):
do_something = kwargs.pop("do_something", False)
你看到的行为发生是因为Python试图在匹配参数方面很聪明,所以例如如果传递过多的位置参数,它会使关键字参数成为位置。
PS为什么不将它存储为metadict
的属性而不是作为dict中的条目?