微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用整数键制作 TypedDict?

如何解决如何使用整数键制作 TypedDict?

是否可以在 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.

中没有具体说明

解决方法

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))),但静态类型检查器应该理解其意图。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。