【发布时间】:2015-05-13 17:50:30
【问题描述】:
在 Python 中,后跟逗号的变量或文字是 one-tuple:
1, # (1,)
...以及一系列以逗号分隔的变量/文字(无论是否后跟逗号)也是tuple:
1,2, # (1,2)
1,2 # (1,2)
但是,在可调用/函数内部,此语法的处理方式有所不同,因为逗号用于分隔参数:
bool(5>6,) # False - 5>6 == False
bool((5>6,)) # True - (5>6,) is a non-empty tuple (always True - contents ignored)
第一行似乎只是忽略了悬挂的逗号。第二行创建一个-tuple(如预期的那样)。这也适用于用户定义的函数(不知道为什么不这样):
def f(arg):
pass
f(1,) # No Error
还要考虑assert 的以下行为(这是一个语句,而不是一个函数):
assert 5>6 # AssertionError, as expected
assert(5>6) # AssertionError, as expected
assert 5>6, # SyntaxError: invalid syntax
assert(5>6,) # SyntaxWarning: assertion always true, perhaps remove parentheses?
assert 5>6, 'NOPE!' # AssertionError: NOPE!, as expected
因此我对挂逗号的处理方式解读如下:
- 如果逗号在函数参数的上下文中,则会被忽略
- 如果逗号在语句的上下文中,则为语法错误
- 在其他地方,它被解释为
tuple对象的一部分
我的问题:我对上述行为的解释是否正确? Python 解释器是否会简单地忽略参数列表中的悬挂逗号?这种行为是否因 Python 实现而异?最后:为什么在语句末尾(语法错误)和参数列表末尾(无语法错误)的悬挂逗号的处理不一致?
编辑:在阅读答案并进一步思考之后,我的解释应该修改如下:
- 始终忽略悬挂逗号,但以下两种情况除外
- 如果悬挂逗号在语句的上下文中,则为语法错误
- 如果悬挂的逗号表示一个-
tuple
但是,这仍然留下了一个问题,即为什么在为语句提供参数时不会忽略悬挂逗号,而在为函数提供参数时会忽略它们。
【问题讨论】:
-
assert不是一个函数,因此只有逻辑忽略括号除非你创建一个元组。