Python2:*argv之后的参数

Python2:*argv之后的参数,python,python-2.7,Python,Python 2.7,我发现py2和py3之间有奇怪的区别 请参阅以下代码: 当我尝试在py2中使用此方法导入类时: from trace import EventTracer3 Traceback (most recent call last): File "<stdin>", line 1, in <module> File "trace.py", line 101 def trace(self, event, *argv, frame=None): SyntaxErro

我发现py2和py3之间有奇怪的区别

请参阅以下代码:

当我尝试在py2中使用此方法导入类时:

from trace import EventTracer3
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "trace.py", line 101
   def trace(self, event, *argv, frame=None):

SyntaxError: invalid syntax
从跟踪导入EventTracer3
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“trace.py”,第101行
def跟踪(自身、事件、*argv、帧=无):
SyntaxError:无效语法
但是对于py3来说这是可以的。 我在py2中找不到函数的参数有任何限制。。。
这实际上有点奇怪,因为据我所知,python2和python3在函数声明方面不应该有任何区别。我错了还是对了?

故意的,有记录的。见:

…因此,您可以使用常规参数,逗号分隔,后跟
*NAME
*NAME、**NAME
**NAME
——这必须是参数列表的结尾

您还可以查看的对kwargs的描述:

当存在**名称形式的final形式参数时,[…]

……增加了重点;在Python 2中,kwargs必须是列表中的最后一个参数



引入Python3.0,它添加了只能跟随vararg列表的关键字参数;这就是您的示例代码所使用的。

如果我没有弄错的话,这是PEP 3102。谢谢您的解释。这对我的需要有点不方便。我想我需要做一些变通来让它在py2上工作
parameters: '(' [varargslist] ')'
varargslist: ((fpdef ['=' test] ',')*
              ('*' NAME [',' '**' NAME] | '**' NAME) |
              fpdef ['=' test] (',' fpdef ['=' test])* [','])