我只是在一天中的大部分时间里发现了一个错误,这个错误是在一份任务声明的末尾由一个错误逗号引起的。第三方回调库捕获异常加剧了查找我的错误的困难,但它让我想知道为什么Python (2.x)不引发语法错误而不是创建元组。考虑以下几点
>>> a = 1,
>>> a
(1,)正如您所看到的,后面的逗号创建了一个单例元组。这并不违反Python语法(参见列表),但它肯定会导致一些意想不到的结果。
>>> a == 1,
(False,)vs
>>> (1,) == a
True虽然我现在了解了发生了什么,但我很困惑为什么Python允许这种语法,而不需要明确的括号来创建一个元组。在某些情况下这种行为是必要的,或者至少是有利的?--在过去的7年里,我几乎完全用进行编程--而且我从来不需要用这种方式创建一个单独的实例。在大多数方面,Python是一种可读性和显式的语言。这个特殊的“特征”似乎,嗯,非毕达通。
发布于 2012-07-23 23:16:28
下面是Python,解说的创建者Guido,这个语法是如何出现的:
在元组中添加类似数组的接口的结果之一是,我必须想出一些方法来解决长度为0或1的元组的边缘情况。我从ABC中学到的规则之一是,在打印或转换为字符串时,每个数据类型都应该由一个表达式来表示,该表达式是语言解析器的有效输入。因此,我需要对0和1长的元组进行符号化。同时,我不想失去一元组和带括号的表达式之间的区别,所以我选择了一种丑陋但实用的方法,在这种方法中,后面的逗号会将一个表达式变成一个元组,而"()“则表示一个零元组。除了这里,Python的元组语法通常不需要括号是不值得的--我觉得用“nothing”表示空元组太容易掩盖真正的排版。
还请参阅PythonInfo Wiki在TupleSyntax上的用法,特别是“.定义元组的是逗号,而不是括号。”
虽然这种语法并不漂亮(Guido说得很难看,但很实用),但我不认为这是个好问题。真正的问题在于您的第三方库“捕获异常”,从而隐藏了有关错误的重要信息。
发布于 2012-07-23 22:16:55
这里有一个例子,它很有用,可以交换两个值。当然,这里可以使用显式括号,但如果没有括号,情况会更好。
a, b = b, a发布于 2012-07-23 22:52:34
对不起,我没有足够的代表发表评论,所以这是自己的答案。
这里有两个相关但不同的东西--元组解压和创建元组文字。
元组拆包在马克·兰森的回答中找到了。
然而,对于人们来说,元组似乎是一个绊脚石。它们不是用圆括号创建的,圆括号只用于消歧。逗号定义一个元组,所以a,是一个包含一个元素的元组,因为元组就是这样的,一个带有逗号的东西:)。(但要注意的是,对于空元组,而不是看起来丑陋的,,我们只能使用(),这可能是人们在这方面遇到困难的根源。)
https://stackoverflow.com/questions/11621289
复制相似问题