python语法错误*带有可选arg的args

时间:2016-04-13 20:05:32

标签: python python-2.7

为什么这是语法错误?做这件事的合适方法是什么?

>>> def f(*args, option=None):
  File "<stdin>", line 1
    def f(*args, option=None):
                      ^
SyntaxError: invalid syntax

4 个答案:

答案 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)

如果它会帮助某人,我仍然遇到安装了python 3.X的错误......

我正在使用Windows,并通过右键单击我的.py文件并选择“使用IDLE编辑”来启动我的代码。

enter image description here

实际上,我注意到我的IDLE版本在python 2.X上运行。至少......点击第一个“使用IDLE编辑”按钮...

只需点击第二个按钮,您就会找到解决方案......

enter image description here

我想我已经安装了两个版本:|