gpt4 book ai didi

python - 逗号语法 : rationale behind a hanging comma in a statement being a SyntaxError

转载 作者:太空宇宙 更新时间:2023-11-03 12:58:45 25 4
gpt4 key购买 nike

在 Python 中,一个变量或文字后跟一个逗号是一个单元组:

1, # (1,)

...以及一系列以逗号分隔的变量/文字(无论它们后面是否带有逗号)也是一个元组:

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)

第一行似乎完全忽略了悬挂的逗号。第二行创建一个 one-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 实现而异?最后:为什么在语句末尾(语法错误)和参数列表末尾(无语法错误)悬挂逗号的处理不一致?

编辑:阅读答案并仔细思考后,我的解释应修改如下:

  • 悬挂的逗号总是被忽略,除了以下两种情况
  • 如果悬挂逗号出现在语句的上下文中,则为语法错误
  • 如果悬挂的逗号表示一个元组

然而,这仍然留下了一个问题,为什么在为语句提供参数时不忽略悬挂逗号,而在为函数提供参数时忽略它们。

最佳答案

在任何以逗号分隔的列表(函数调用、列表/字典文字等)中,尾随逗号始终被忽略。您的assert 示例不是以逗号分隔的列表。

单元组需要尾随逗号的唯一原因是因为无法区分单元组和括号表达式。

关于python - 逗号语法 : rationale behind a hanging comma in a statement being a SyntaxError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30221984/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com