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

Python 这种奇怪的冒号行为在做什么?,python,python-3.x,Python,Python 3.x,我正在使用Python3.6.1,我遇到了一些非常奇怪的事情。我有一个简单的字典作业打字错误,花了我很长时间才找到 context = {} context["a"]: 2 print(context) 输出 {} 代码上下文[“a”]:2在做什么?它不会在应该的时候引发一个SyntaxError。起初我以为它是在创建一个切片。但是,键入repr(context[“a”]:2)会引发SyntaxError。我还在控制台中键入了context[“a”]:2,控制台没有打印任何内容。我想它可能返

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

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

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

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

另外,
context[“a”]
应该引发一个
KeyError


我很困惑。发生了什么事?

您意外地编写了语法正确的变量注释。该特性是在Python 3.6中引入的(请参阅)

虽然变量注释是分析的一部分,但赋值语句是可选的:

因此,在
上下文中[“a”]:2

  • context[“a”]
    是注释目标
  • 2
    是注释本身
  • 上下文[“a”]
    未初始化
PEP声明“注释的目标可以是任何有效的单一赋值目标,至少在语法上是如此(这取决于类型检查器如何处理)”,这意味着注释不需要存在键(因此不存在
KeyError
)。以下是原始政治公众人物的一个例子:

d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.
通常,注释表达式的计算结果应为Python类型-- 毕竟注释的主要用途是类型暗示,但它不是强制的。注释可以是任何有效的Python表达式,而不管结果的类型或值如何


如您所见,此时类型提示非常随意,很少有用,除非您有一个静态类型检查器,例如。

这难道不需要一个
=
赋值运算符吗?钥匙不存在。我觉得这不对。在这种情况下,
是赋值运算符。我们只是单独“分配”一个类型注释,而不是一个键。我怀疑有什么理由允许它,只是添加注释语法的意外副作用。@chepner这似乎不是副作用。这正是相应的PEP设计的目的。奇怪的是,它允许您注释尚未定义的目标。如果我的第一行是
x:str
,紧接着是
type(x)
,那么解释器将发出
namererror
。在我看来,语法应该强制对象是预定义的,或者是当场定义的。这只会引起混乱。@Idlehands这违背了目的。在
x:str
之前加上
x='i am a string'
,使后一种方法变得多余。。这根本不应该添加。这是很好的评论;我从来没有以这种或那种方式展示它。这个问题已经有了一个明确的答案,很明显这让Python新手感到困惑。如果Python是您唯一的语言,我想这是最糟糕的,在初始化之前的类型暗示和变量定义通常可能会感觉陌生。我认为提出错误是不可能的,因为这种行为是故意的,有时是有用的,正如PEP 526中所解释的,并且您不想破坏兼容性。但是,我想知道Python DEVs是否会考虑在某些情况下添加有用的警告消息。这能回答你的问题吗?
d = {}
d['a']: int = 0  # Annotates d['a'] with int.
d['b']: int      # Annotates d['b'] with int.