为何使用非字符串字面量作为TypedDict键名的Python代码仍可运行?
关于TypedDict使用非字符串键仍能运行的疑问
我使用了嵌套的TypedDict,代码能正常运行,但在Thonny Assistant中收到警告,原因是未在字典中全部使用字符串字面量作为键名。我原本以为这类代码会运行失败,因为我认为TypedDict必须使用字符串字面量作为键名,但实际Python并未报错。以下是示例代码,想请教为何该代码仍能正常运行?
from typing import TypedDict S_Info = TypedDict('S_Info', {'Type':int, 'Avail': bool, 'Pause': bool,'Status': int}) B_Types = TypedDict('B_Types',{0x01: S_Info, 0x02: S_Info}) bmatrix: B_Types = { 0x01:{ 0b000: {'Type': 0x21, 'Avail': 1, 'Pause': 0, 'Status':0}, 0b001: {'Type': 0x81, 'Avail': 1, 'Pause': 0, 'Status':2}, 0b010: {'Type': 0x41, 'Avail': 1, 'Pause': 0, 'Status':0}}, 0x02:{ 0b000: {'Type': 0x22, 'Avail': 0, 'Pause': 0, 'Status':1}, 0b001: {'Type': 0x82, 'Avail': 0, 'Pause': 1, 'Status':9}, 0b010: {'Type': 0x42, 'Avail': 0, 'Pause': 0, 'Status':0}} } print(bmatrix[0x02])
原因解析
TypedDict仅做类型提示,不影响运行时逻辑
Python的类型提示(包括TypedDict)是给静态检查工具用的,运行时Python解释器会完全忽略这些注解。只要字典本身的语法合法,不管TypedDict定义是否符合规范,代码都能正常执行,不会触发运行时错误。旧构造语法的宽松性
你用的是TypedDict的旧式构造写法:TypedDict('B_Types', {0x01: S_Info, 0x02: S_Info})。这种写法虽然违反了TypedDict的设计初衷(TypedDict原本是用来定义键为字符串的字典类型),但Python解释器不会阻止你这么写。正规的TypedDict应该用类语法定义,且键必须是字符串,例如:
class S_Info(TypedDict): Type: int Avail: bool Pause: bool Status: int
- 警告是静态检查的规范提示
Thonny Assistant的警告只是在提醒你违反了TypedDict的设计约定,并非代码存在语法错误。如果用更严格的类型检查工具(比如mypy),会直接抛出类型错误,但这不影响代码的实际运行。
另外补充:你代码里给bool类型的Avail和Pause赋值整数1、0,Python允许这么做(因为bool是int的子类),但同样会被静态检查工具警告,属于类型不匹配的问题。
内容的提问来源于stack exchange,提问作者DocMike65
相关产品推荐
相关产品推荐

