如何使用整数键制作 TypedDict?
How to make a TypedDict with integer keys?
是否可以在 TypedDict 中使用整数键(类似于字典?)。
尝试一个简单的例子:
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 中是明确的(添加了强调):
This PEP proposes a type constructor typing.TypedDict
to support the use case where a dictionary object has a specific set of string keys, each with a value of a specific type.
并且鉴于预期的用例在 class 语法中都是可注释的,隐式仅适用于 dict
s 由构成有效标识符的字符串键入(您可以用作属性或关键字参数名称的东西), 甚至不是一般的字符串。因此,正如预期的那样,int
键不是问题,这只是为了启用 class,它使用类似 dict
的语法来访问“属性”而不是属性访问语法。
虽然 the alternative, backwards compatible syntax 允许与 pre-3.6 Python 兼容,但允许这样做(以及允许无效 Python 标识符的字符串),例如:
Moves = TypedDict('Moves', {0: int, 1: int})
你只能用 dict
文字(例如 Moves({0: 123, 1: 456})
)构造它,因为像 Moves(0=123, 1=456)
这样更简洁的关键字语法不起作用。即使这在技术上在运行时有效(毕竟只是 dict
s 在引擎盖下),验证类型正确性的实际类型检查器可能不支持它(因为意图和记录的使用专门处理字符串构成有效标识符)。
要点是,不要这样做。对于您在此处描述的简单情况(从零开始的连续整数“键”,其中每个位置都有独立的含义,它们可能因类型而异,也可能不同),您实际上只想要一个 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))
),但静态类型检查器应该理解其意图。
是否可以在 TypedDict 中使用整数键(类似于字典?)。
尝试一个简单的例子:
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 中是明确的(添加了强调):
This PEP proposes a type constructor
typing.TypedDict
to support the use case where a dictionary object has a specific set of string keys, each with a value of a specific type.
并且鉴于预期的用例在 class 语法中都是可注释的,隐式仅适用于 dict
s 由构成有效标识符的字符串键入(您可以用作属性或关键字参数名称的东西), 甚至不是一般的字符串。因此,正如预期的那样,int
键不是问题,这只是为了启用 class,它使用类似 dict
的语法来访问“属性”而不是属性访问语法。
虽然 the alternative, backwards compatible syntax 允许与 pre-3.6 Python 兼容,但允许这样做(以及允许无效 Python 标识符的字符串),例如:
Moves = TypedDict('Moves', {0: int, 1: int})
你只能用 dict
文字(例如 Moves({0: 123, 1: 456})
)构造它,因为像 Moves(0=123, 1=456)
这样更简洁的关键字语法不起作用。即使这在技术上在运行时有效(毕竟只是 dict
s 在引擎盖下),验证类型正确性的实际类型检查器可能不支持它(因为意图和记录的使用专门处理字符串构成有效标识符)。
要点是,不要这样做。对于您在此处描述的简单情况(从零开始的连续整数“键”,其中每个位置都有独立的含义,它们可能因类型而异,也可能不同),您实际上只想要一个 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))
),但静态类型检查器应该理解其意图。