如何使用整数键制作 TypedDict?

问题描述 投票:0回答:1

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

尝试一个简单的例子:

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

投掷:

SyntaxError: illegal target for annotation

似乎只支持

Mapping[str, int]
,但我想确认一下。 Pep 文档中没有具体说明。

python integer python-typing typeddict
1个回答
4
投票

TypedDict
的意图在PEP摘要中很明确(强调已添加):

此 PEP 提出了一个类型构造函数

typing.TypedDict
来支持字典对象具有 一组特定的字符串键,每个字符串键都有一个特定类型的值的用例。

并且考虑到预期的用例都是可在类语法中注释的,隐式仅适用于由构成有效标识符的字符串(您可以用作属性或关键字参数名称的东西)键入的

dict
,甚至一般情况下的字符串也不适用。因此,正如预期的那样,
int
键不是一个东西,这只是为了使类能够使用类似
dict
的语法来访问“属性”而不是属性访问语法。

虽然另一种向后兼容的语法允许与 3.6 之前的 Python 兼容,但允许这样做(以及允许不是有效 Python 标识符的字符串),例如:

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

您只能使用

dict
文字(例如
Moves({0: 123, 1: 456})
)来构造它,因为像
Moves(0=123, 1=456)
这样的更清晰的关键字语法不起作用。即使这在技术上在运行时有效(毕竟这只是在幕后),验证类型正确性的实际类型检查器可能不支持它(因为意图和记录的使用专门处理构成有效的字符串)标识符)。
重点是,不要这样做。对于您在这里描述的简单情况(从零开始的连续整数“键”,其中每个位置都有独立的含义,它们可能会或可能不会因类型而不同),无论如何,您实际上只需要一个 

dict

tuple

将以同样的方式用于注释,并且您在代码中的实际使用点将只是普通的 
Moves = typing.Tuple[int, int] # Could be [int, str] if index 1 should be a string

语法 (

tuple
)。
如果您确实希望在创建实例时能够使用名称 

return 1, 2

,在 3.9+ 上您可以使用

PEP 585
来执行(无需导入): Moves

允许您写:

Moves = tuple[int, int]

当你想为其制作一个“实例”时。不涉及运行时检查(大致相当于在运行时运行 
return Moves((1, 2))

),但静态类型检查器应该理解其意图。

    

© www.soinside.com 2019 - 2024. All rights reserved.