【问题标题】:Use of colon ':' in type hints在类型提示中使用冒号 ':'
【发布时间】:2022-01-20 22:29:41
【问题描述】:

当对 dict 类型的变量进行类型注释时,通常你会这样注释它:

numeralToInteger: dict[str, int] = {...}

但是我用冒号而不是逗号重写了这个:

numeralToInteger: dict[str : int] = {...}

这也有效,不会引发 SyntaxError 或 NameError。

在检查 __annotations__ 全局变量时:

colon: dict[str : int] = {...}
comma: dict[str, int] = {...}

print(__annotations__)

输出是:

{'colon': dict[slice(<class 'str'>, <class 'int'>, None)],
 'comma': dict[str, int]}

因此,冒号被视为切片对象,逗号被视为普通类型提示。

我应该在 dict 类型中使用冒号还是应该坚持使用逗号?

我使用的是 Python 版本 3.10.1。

【问题讨论】:

  • 类型提示可以是任何东西。决定有效性的是它与编辑器的交互方式,或者任何解释它们的软件。
  • 由于 dict 的隐含用途是将字符串转换为整数,这意味着 dict 具有 str 类型的键和 int 类型的值。因此,在这种情况下,逗号分隔符是正确的类型提示。或者你的钥匙是切片的?我想不会。
  • @RichardNeumann 就可读性而言,将 dict[str : int] 例如视为冒号“表示”它将 str 映射到 int 是有意义的,因为它遵循文字 dict 语法。我猜你正在查看说明类型提示中的值应该用逗号分隔的文档。正如 Mad Physicist 所说,文档还概述了它们对实际的 python 代码没有影响,所以这只是让它纯粹偏爱你想要如何设置它的样式。对我来说更好的问题是“我应该遵守什么约定?”
  • @Magmurrr 不,它没有。它创建一个slice 对象。这不是应该如何使用这种类型提示的。如果您使用类型检查器,它会向您大喊,键不是字符串而是切片。

标签: python python-3.x slice python-typing


【解决方案1】:

如果您有一个键是字符串而值是整数的字典,您应该使用dict[str, int]。这不是可选的。 IDE 和类型检查器使用这些类型提示来帮助您。当你说dict[str : int] 时,它是一个切片对象。完全不同的东西。

mypy playground试试这些:

d: dict[str, int]
d = {'hi': 20}

c: dict[str: int]
c = {'hi': 20}

消息:

main.py:4: error: "dict" expects 2 type arguments, but 1 given
main.py:4: error: Invalid type comment or annotation
main.py:4: note: did you mean to use ',' instead of ':' ?
Found 2 errors in 1 file (checked 1 source file)

错误信息说明一切

【讨论】:

  • 我应该重新表述我的问题,因为我纯粹是从文体角度提出问题,而不是关于类型提示的正确性。我不只使用 IDE 一个文本编辑器,所以我不担心类型检查器。我会接受这个并留下这个问题,以防其他人对潜在的差异感到困惑!
  • 如果str: int是一个切片对象,那么str, int是一个元组对象吗?或者逗号在类型提示中是否意味着不同的东西?
  • @KellyBundy 他们所处的环境很重要。创建切片对象是因为 str: int 位于下标符号 - 括号内。同样,如果 x, y 在函数调用的括号内,它就不是元组。但我没有信心在这里说“是”str, int 是一个元组。它可以当然是(__getitem__ 的实现取决于我们)。也许类型元类实现了__getitem__ 来接受 dict 的元组并将它们转换为类型提示。
  • 但是它们在同一个上下文中。 str, int 不在函数调用的括号内,它在下标符号 - 括号内 - 就像 str: int 一样。我不知道类型提示是否有自己的规则,但是在“普通”代码中,这使它成为一个元组(至少那是 __getitem__ 得到的)。
  • 哈,我认为 Python 本身会丢弃类型提示,但事实并非如此,disassembly 表明它确实在类型提示中构建了一个元组以及总体情况。
【解决方案2】:

使用dict[str:int],您传递的提示是dict,其键是切片,因为x:y 在python 中是slice

dict[str, int] 传递正确的键和值提示,以前也有 typing.Dict,但已被弃用。

【讨论】:

  • 同样,x,y 是 Python 中的 元组。所以按照这个逻辑,dict[str, int] 没有传递正确的键和值 hints 而只是 one 提示,一个元组。对吗?
猜你喜欢
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2018-01-08
  • 2014-01-31
  • 2017-11-28
  • 2012-05-10
  • 1970-01-01
相关资源
最近更新 更多