【问题标题】:Shouldn't "a:1" be a syntax error in python? [duplicate]“a:1”不应该是python中的语法错误吗? [复制]
【发布时间】:2019-07-28 06:52:12
【问题描述】:

我在代码中犯了一个错字,在语法上完全无声。

dict_args : {"arg1":1,"arg2":2,"arg3":3}
# .... Some more code
some_function(**dict_args)
# .... Some more code

如果你没有注意到,这是在声明变量dict_args时使用:而不是=

所以我的问题是,python 语法:a:1本身,是否有任何意义?还是应该假设它是语法错误?

【问题讨论】:

  • 它被解释为类型提示。
  • 如有疑问,您可以通过import dis; dis.dis('a : 1') 了解正在发生的事情。如前所述,代码为左侧设置了注释。
  • 要跟进@PatrickHaugh 的评论,请查看type hint documentation
  • 也就是说,您可以这样做有点有点奇怪,例如a : 1 即使a 不存在,并且在该行运行后仍然不存在。
  • 它是一个变量注解,其中一个使用是作为类型提示。

标签: python python-3.x syntax syntax-error


【解决方案1】:

PEP-526 引入了变量注解,它为程序员提供了一种向变量添加类型信息的方法。除其他外,这允许诸如

之类的语句
x: int

表示存在int 类型的局部变量,无需对其进行初始化。在PEP-484 - Acceptable Type Hints 中,我们可以看到注释“必须是在不引发异常的情况下进行评估的有效表达式”,您的字典文字就是这样。

如果您查看Python grammar itself,您会发现expr_stmtannassign 规则使您展示的示例合法。

如果您使用的是 IDE/其他类型提示工具,他们肯定会抱怨这一点,但这并不违反 Python 设置的规则。

【讨论】:

  • 虽然我理解你的回答,但我实际上并不同意它应该是可以接受的。为什么要注释还不存在的东西?它至少应该限于参数的范围或变量赋值。例如:x: int = 1 绝对有意义。在定义值之前进行注释就像我试图告诉你,没有任何上下文 Victor works as a vendor.. 是的,但是 Victor 是谁,我为什么要关心?
  • 我倾向于同意你的观点,尽管这是使数据类以其当前形式成为可能的语法。 Guiod 的理由 here 是它使分配可能在多个地方发生的情况变得更容易,但我不确定这是多么容易出错的借口
  • @Aetos 因为只有值而不是名称有类型,所以将a: int 视为提示一个值被分配给a,它必须是一个int。没有理由必须立即分配int 以使提示有效。
  • 这样的注解最初并不会被限制为类型提示。函数注释最初是开放的,以查看人们可以为它们找到什么用途。例如,您可以简单地提供一个简短的文档字符串来描述变量的用途。我相信,在 Python 4 中,注释甚至不再被评估为表达式,而是作为文字字符串存储在适当的 __annotations__ 属性中。
  • (参见python.org/dev/peps/pep-0563,关于注释的延迟评估。不过,我注意到它确实不赞成使用注释的非类型提示。在未来,这种使用可能会正式被禁止,尽管由于当时解析器将有效地将注释视为字符串文字,但似乎没有太多理由去麻烦这样做。)
猜你喜欢
  • 1970-01-01
  • 2018-08-20
  • 1970-01-01
  • 2018-12-05
  • 1970-01-01
  • 2017-01-30
  • 2015-10-16
  • 1970-01-01
  • 2020-10-28
相关资源
最近更新 更多