Python2:* argv之后的参数

时间:2015-01-29 23:11:49

标签: python python-2.7

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

请看一段代码: https://github.com/DoumanAsh/collectionScripts/blob/master/python/art/trace.py#L101

当我尝试在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

但对于py3来说还可以。 py2中函数参数的任何限制都无法找到... 实际上有点奇怪,因为据我所知,在函数声明方面python2和python3之间应该没有任何区别。我错了还是对的?

1 个答案:

答案 0 :(得分:3)

有意识,并记录在案。见the Python 2 grammar

parameters: '(' [varargslist] ')'
varargslist: ((fpdef ['=' test] ',')*
              ('*' NAME [',' '**' NAME] | '**' NAME) |
              fpdef ['=' test] (',' fpdef ['=' test])* [','])

...所以,您可以使用常规参数,以逗号分隔,后跟 *NAME*NAME, **NAME**NAME - 必须是你的参数列表的结尾。

您还可以看到Python 2 tutorial对kwargs的描述:

  

当存在**名称形式的最终形式参数时,[...]

......强调增加;在Python 2中,kwargs必须是列表中的最后一个参数。


Python 3.0引入了PEP 3102,它添加了可以跟随vararg列表的仅限关键字的参数;这是您的示例代码使用的内容。