这种奇怪的冒号行为在做什么?

2024-04-26 01:25:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在使用Python3.6.1,我遇到了一些非常奇怪的事情。我有一个简单的字典作业打字错误,花了我很长时间才找到

context = {}
context["a"]: 2
print(context)

输出

{}

代码context["a"]: 2在做什么?它不会在应该的时候引发SyntaxError。起初我以为它是在创建一个切片。但是,键入repr(context["a"]: 2)会引发SyntaxError。我还在控制台中键入了context["a"]: 2,控制台没有打印任何内容。我想它可能会返回None,但我不太确定

我还认为它可以是单行if语句,但这也不应该是正确的语法

此外,context["a"]应该引发KeyError

我很困惑。发生了什么事


Tags: 代码none内容键入if字典错误作业
2条回答

您意外地编写了语法正确的变量注释。这个特性是在Python3.6中引入的(参见PEP 526

尽管变量注释是作为annotated assignment的一部分进行分析的,但赋值语句是可选的:

annotated_assignment_stmt ::=  augtarget ":" expression ["=" expression]

因此,在context["a"]: 2

  • context["a"]是注释目标
  • 2是注释本身
  • context["a"]未初始化

PEP声明,“注释的目标可以是任何有效的单一赋值目标,至少在语法上是如此(由类型检查器决定如何处理)”,这意味着注释不需要存在键(因此不存在^{)。以下是原始政治公众人物的一个例子:

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.

通常,注释表达式计算为Python类型 毕竟注释的主要用途是类型暗示,但它不是强制的。注释可以是任何有效的Python表达式,而不管结果的类型或值如何

正如您所看到的,此时类型提示非常随意,很少有用,除非您有一个静态类型检查器,如mypy

注释自动存储在__annotations__中,这是x: y的一个命令y必须是有效的表达式,即y,或者:右侧的任何内容都必须求值。另一方面x,必须至少能够成为一个键,因此可以散列

此外,LHS不能是集合,因为集合是不可损坏的, >>> {2}: 8

SyntaxError: illegal target for annotation

也没有列出: >>> [2]: 8

[2]: 8 SyntaxError: only single target (not list) can be annotated

也不是元组:

>>> (2,3): 8 (2,3): 8 SyntaxError: only single target (not tuple) can be annotated

相关问题 更多 >

    热门问题