我知道我可以使用*
强制将函数/方法的所有关键字参数“命名”。
如果我有
def abc(a, *, x=10, z=30):
pass
然后以下所有工作
abc(5)
abc(8, x=12)
abc(9, z=31)
abc(x=17, a=4)
即使我将函数签名更改为def abc(a, *, x=10, y=20, z=30)
,
和
abc(7, 13)
抛出错误。
这非常重要,因为我可以使用逻辑位置,这将有助于长期维护,而不必被迫使用基于历史记录的结束位置。
但是*在Python 2.7中无效,abc(a, *args, x=10, z=30)
(我试过)也不起作用。
有没有办法强制在Python 2.7中使用x=12
?或者另一种说法:make abc(7, 13)
在Python 2.7上无效。
答案 0 :(得分:3)
这样做的一种方法是添加一个永远不会获得有效位置值的伪关键字参数(因此不要检查None
):
_dummy = object()
def abc(a, dummy_kw=_dummy, x=10, z=30):
if dummy_kw is not _dummy:
raise TypeError("abc() takes 1 positional argument but at least 2 were given")
这将禁止abc(7, 13)
并允许所有其他人。 它适用于Python 2和Python 3,因此当您需要在两者上运行代码时它非常有用。
最初我用过:
def _dummy():
pass
但正如@mata所指出的那样_dummy=object()
也很有效,而且更干净。基本上任何未以其他方式使用的唯一内存位置都可以使用。
答案 1 :(得分:0)
以下内容如何:
def abc(a, **kwargs):
# Get arguments from kwargs otherwise use default values
x = kwargs.pop('x', 10)
z = kwargs.pop('z', 30)
if not kwargs: # if kwargs is not empty
print 'extra parameters passed'
pass
这允许强制使用kwargs并且仍然具有默认值。
使用后, pop
会从kwargs
中删除密钥。
这可能非常有用,因为您可以检查用户是否提供了不属于该函数的额外参数,在这种情况下您可以抛出错误(例如)。