【发布时间】:2012-11-21 03:25:27
【问题描述】:
这是我的一门课:
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 上
【问题讨论】:
-
我认为问题在于您在位置参数之前定义了关键字参数(
do_something是关键字,*args是位置参数)。然后,当您将值作为构造函数中的第一个元素传递时,它会被传递给do_something。尝试将do_something放在*args之后。 -
@RocketDonkey 我试过但显然在 python 2.6 中不支持
-
啊,有趣。无论如何,看起来你已经解决了,祝你一切顺利!
-
@RocketDonkey 我没有,但如果 3.0 版中有此功能,则意味着没有简单的解决方法。所以我只是运气不好。
-
所以这很混乱,可能会导致其他问题并且绝对不值得回答(足够的免责声明?:)),但对我有用的一件事*不是打开包装
*args(所以使用@987654333 @ 反而)。然后你可以把你的do_something=False放在args之后,做你的签名self, args, do_something=False, **kwargs。然后当你调用super时,使用.__init__(args, **kwargs)。 *如果您使用dict(one=1, two=2)语法,这将不起作用,因为它依赖于传递一个迭代,然后由dict类本身解包。再次,可怕的解决方案,但如果你绝望...... :)
标签: python optional-arguments keyword-argument