【问题标题】:How to make a TypedDict with integer keys?如何使用整数键制作 TypedDict?
【发布时间】:2021-01-04 19:43:08
【问题描述】:

是否可以在 TypedDict 中使用整数键(类似于 dict?)。

尝试一个简单的例子:

    from typing import TypedDict 
    
    class Moves(TypedDict):
      0: int=1
      1: int=2

抛出:SyntaxError: illegal target for annotation

似乎只支持Mapping[str, int],但我想确认一下。 Pep docs.中没有具体说明

【问题讨论】:

标签: python-3.x integer type-hinting typeddict


【解决方案1】:

TypedDict 的意图在 the PEP's abstract 中是明确的(添加了重点):

此 PEP 提出了一个类型构造函数 typing.TypedDict 来支持字典对象具有一组特定字符串键的用例,每个字符串键都有一个特定类型的值。

并且鉴于预期的用例在类语法中都是可注释的,隐式仅适用于由构成有效标识符(可以用作属性或关键字参数名称的东西)的字符串键入的dicts,甚至不是一般的字符串。所以正如预期的那样,int 键不是一个东西,这只是为了启用一个使用类似dict 语法的类来访问“属性”而不是属性访问语法。

虽然 the alternative, backwards compatible syntax 允许与 3.6 之前的 Python 兼容,但允许这样做(以及允许不是有效 Python 标识符的字符串),例如:

Moves = TypedDict('Moves', {0: int, 1: int})

您只能使用 dict 文字(例如 Moves({0: 123, 1: 456}))来构造它,因为像 Moves(0=123, 1=456) 这样的更简洁的关键字语法不起作用。即使这在技术上在运行时有效(毕竟只是 dicts 在幕后),验证您的类型正确性的实际类型检查器可能不支持它(因为意图和记录的使用专门处理构成有效的字符串标识符)。

重点是,不要这样做。对于您在此处描述的简单情况(从零开始的连续整数整数“键”,其中每个位置具有独立的含义,它们可能会或可能不会因类型而异),您真的只想要一个tuple

Moves = typing.Tuple[int, int]  # Could be [int, str] if index 1 should be a string

将以相同的方式用于注释,并且您在代码中的实际使用点将是普通的tuple 语法 (return 1, 2)。

如果您真的希望能够在创建实例时使用名称 Moves,在 3.9+ 上您可以使用 PEP 585 来执行(无需导入):

Moves = tuple[int, int]

允许你写:

return Moves((1, 2))

当您想要创建它的“实例”时。不涉及运行时检查(大致相当于在运行时运行tuple((1, 2))),但静态类型检查器应该理解其意图。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-31
    • 2022-11-17
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2012-08-30
    • 2014-11-17
    • 1970-01-01
    相关资源
    最近更新 更多