Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 逗号语法:语句中挂起逗号作为语法错误的基本原理_Python_Syntax_Comma - Fatal编程技术网

Python 逗号语法:语句中挂起逗号作为语法错误的基本原理

Python 逗号语法:语句中挂起逗号作为语法错误的基本原理,python,syntax,comma,Python,Syntax,Comma,在Python中,后跟挂起逗号的变量或文字是一个元组: 1, # (1,) 1,2, # (1,2) 1,2 # (1,2) …和一系列以逗号分隔的变量/文字(无论它们后面是否跟有挂起的逗号)也是一个元组: 1, # (1,) 1,2, # (1,2) 1,2 # (1,2) 但是,在可调用/函数中,此语法的处理方式不同,因为逗号用于分隔参数: bool(5>6,) # False - 5>6 == False bool((5>6,)) # True - (5>6

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

1, # (1,)
1,2, # (1,2)
1,2 # (1,2)
…和一系列以逗号分隔的变量/文字(无论它们后面是否跟有挂起的逗号)也是一个
元组

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)
第一行似乎忽略了挂起的逗号。第二行创建一个元组(如预期的那样)。这对于用户定义的函数也适用(不知道为什么不适用):

还要考虑
assert
(它是一个语句,而不是一个函数)的以下行为:

因此,我对挂逗号处理的解释如下:

  • 如果逗号位于函数参数的上下文中,则将忽略它
  • 如果逗号在语句的上下文中,则是语法错误
  • 在其他地方,它被解释为
    元组
    对象的一部分
我的问题:我对上述行为的解释正确吗?Python解释器是否只是忽略参数列表中的挂起逗号?这种行为是否因Python实现而异?最后:为什么在处理语句末尾的挂起逗号(语法错误)和参数列表末尾的挂起逗号(无语法错误)时存在不一致

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

  • 除非在以下两种上下文中,否则始终忽略挂起的逗号
  • 如果挂起的逗号在语句的上下文中,则是语法错误
  • 如果挂起的逗号表示一个元组

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

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


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

元组由逗号定义,除非上下文为逗号定义了不同的含义。在这种情况下,您需要使用括号来消除元组逗号和其他逗号之间的歧义


assert
不是一个函数,它是一个语句,因此parethes不是语法的一部分。逗号是,因此需要使用括号来消除元组与断言表达式和失败消息之间的逗号之间的歧义,但仍然需要使用逗号来定义元组

在定义元组和在调用表达式中使用时,始终忽略多余的尾随逗号。但是,您需要知道何时创建元组以及何时对不同的表达式使用逗号。要创建元组,至少需要一个逗号,而在调用中不需要该逗号,因为调用语法不是由逗号运算符定义的

从以下文件:

包含至少一个逗号的表达式列表将生成一个元组。元组的长度是列表中表达式的数量。表达式从左到右求值

只有创建一个元组(又称单元组)才需要后面的逗号;它在所有其他情况下都是可选的。不带尾随逗号的单个表达式不会创建元组,而是生成该表达式的值。(要创建空元组,请使用一对空括号:
()

和来自:

带括号的形式是一个包含在括号中的可选表达式列表:

parenth_form ::=  "(" [expression_list] ")"
带括号的表达式列表产生表达式列表产生的结果:如果列表至少包含一个逗号,则产生一个元组;否则,它将生成组成表达式列表的单个表达式

一对空括号产生一个空元组对象。由于元组是不可变的,因此适用于文本的规则(即,两次出现的空元组可能产生也可能不产生相同的对象)

请注意,元组不是由括号构成的,而是由逗号运算符构成的。空元组是一个例外,它需要括号-在表达式中允许未附加括号的“nothing”将导致歧义,并允许常见的拼写错误不加标记地传递。

我的

最后,从以下方面:

位置参数和关键字参数后可能会出现一个尾随逗号,但不会影响语义


assert
不是一个函数,因此除非创建元组,否则忽略括号是合乎逻辑的。“在
assert
之后逗号没有其他含义-请参阅最后一个
assert
示例,
assert 5>6,'NOPE!'断言者:不。我理解函数和语句是不同的,但这似乎仍然表明,在如何处理提供给每个函数和语句的逗号分隔参数方面存在着轻微的不一致。@Rick:啊,是的;现在这样的逗号越来越少了,但这就是其中之一。“您的
assert
示例不是逗号分隔的列表”-好吧,请参见最后一个
assert
示例,
assert 5>6,'NOPE!'断言者:不。我理解函数和语句是不同的,但这似乎仍然表示在如何处理提供给每个函数的逗号分隔的参数方面存在轻微的不一致。