为什么这是语法错误?做这件事的合适方法是什么?
>>> def f(*args, option=None):
File "<stdin>", line 1
def f(*args, option=None):
^
SyntaxError: invalid syntax
答案 0 :(得分:4)
Python 2没有关键字参数支持。如果您真的希望Python 2函数具有只能通过关键字传递的参数,则需要使用**kwargs
并自己验证关键字参数:
def my_max(*args, **kwargs):
'''Emulate the built-in max, including the keyword-only key argument.'''
key = kwargs.pop('key', None)
if kwargs:
raise TypeError('my_max() got an unexpected keyword argument {!r}'.format(next(iter(kwargs))))
if key is None:
# max doesn't support key=None
return max(*args)
else:
return max(*args, key=key)
答案 1 :(得分:3)
在python 2中不支持,其中*args
必须出现在函数调用签名中的任何命名/默认参数之后。
执行该操作的适当方法是升级到支持它的python 3。
>>> def f(*args, option=None):
... print(args, option)
...
>>> f('not_option')
('not_option',) None
>>> f(1, 2, option='beast mode on!!!')
(1, 2) beast mode on!!!
答案 2 :(得分:3)
在Python 2中,所有位置参数必须位于任何*args
参数之前。在Python 3中,您当前的语法是合法的,将option
创建为“仅关键字”参数。
因此,您可以选择更改参数的顺序:
def f(option=None, *args):
...
如果您想提供任何其他参数,这将要求您提供option
参数,这可能不是您想要的。
另一种选择是使用**kwargs
语法来捕获传递给函数的关键字参数。您可以检查它是否具有option
(而不是任何其他意外的关键字),而不将其命名为位置参数:
def f(*args, **kwargs):
option = kwargs.pop("option", None)
if kwargs:
raise TypeError("unexpected keyword arguments found: {}".format(kwargs))
...
或者您可以升级到Python 3。
答案 3 :(得分:0)