Python 将内置字典强制转换为TypedAct的类型
我有这样的东西(非常简单): 但mypy抱怨说:Python 将内置字典强制转换为TypedAct的类型,python,mypy,typing,python-typing,Python,Mypy,Typing,Python Typing,我有这样的东西(非常简单): 但mypy抱怨说: mymodule.py:9:错误:赋值中的类型不兼容(表达式的类型为“D”,变量的类型为“Dict[str,int]”)。在1个文件中发现1个错误(选中1个源文件) 将普通词典强制转换为TypedDict子类型难道不是有效的吗?如果不是,那么“构建”词典然后声明其类型的正确方法是什么 注意,这是非常简化的;实际上,字典是根据比上面给出的更复杂的算法构建的 更新:即使我更改变量名而不是尝试强制转换类型,问题似乎仍然存在 # mymodule.py
mymodule.py:9:错误:赋值中的类型不兼容(表达式的类型为“D”,变量的类型为“Dict[str,int]”)。在1个文件中发现1个错误(选中1个源文件)
将普通词典强制转换为TypedDict
子类型难道不是有效的吗?如果不是,那么“构建”词典然后声明其类型的正确方法是什么
注意,这是非常简化的;实际上,字典是根据比上面给出的更复杂的算法构建的
更新:即使我更改变量名而不是尝试强制转换类型,问题似乎仍然存在
# mymodule.py
from typing import TypedDict, cast
D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
dd: D = d
错误:赋值中不兼容的类型(表达式的类型为“Dict[str,int]”,变量的类型为“D”)在1个文件中发现1个错误(选中1个源文件)
在构建初始Dict之前,键入强制转换初始Dict:
从输入import-TypeDict开始,强制转换
D=TypedDict('D',{'x':int,'y':int})
d=强制转换(d,{})
d['x']=1
d['y']=2
这确保变量
d
被直接推断为“ad
”。否则,推理会立即锁定d
,作为Dict[…,…]
类型在构建初始Dict之前强制转换它:
从输入import-TypeDict开始,强制转换
D=TypedDict('D',{'x':int,'y':int})
d=强制转换(d,{})
d['x']=1
d['y']=2
这确保变量
d
被直接推断为“ad
”。否则,推断会立即锁定在d
中,作为Dict[…,…]
执行类型转换时,解决方案似乎是使用新的变量名:
# mymodule.py
from typing import TypedDict, cast
D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
dd: D = cast(D, d)
我认为这强制了一种最佳实践,即在向读者表示键从此点以后不会改变时,使用新的变量名。对我来说,这似乎有点过分,但我可以理解为什么类型检查器通常以这种方式处理事情是有利的。编辑:接受答案是更好的方式 解决方案似乎是在执行类型转换时使用新的变量名:
# mymodule.py
from typing import TypedDict, cast
D=TypedDict('D', {'x':int, 'y':int})
d = {}
d['x']=1
d['y']=2
dd: D = cast(D, d)
我认为这强制了一种最佳实践,即在向读者表示键从此点以后不会改变时,使用新的变量名。对我来说,这似乎有点过分,但我可以理解为什么类型检查器通常以这种方式处理事情是有利的。编辑:接受答案是更好的方式 问题不是关于强制转换,而是关于对两个独立的、不兼容的类型重新使用
d
。@MisterMiyagi我明白了。所以,您认为在字典键修复后更改变量名真的是最佳做法吗?@MisterMiyagi马上就看到更新问题了-如果我更改变量名,mypy仍然会抱怨。@MisterMiyagi啊哈!我找到了解决办法。我会发布一个答案。谢谢问题不是关于强制转换,而是关于对两个独立的、不兼容的类型重新使用d
。@MisterMiyagi我明白了。所以,您认为在字典键修复后更改变量名真的是最佳做法吗?@MisterMiyagi马上就看到更新问题了-如果我更改变量名,mypy仍然会抱怨。@MisterMiyagi啊哈!我找到了解决办法。我会发布一个答案。谢谢很好,这正是我想要的。@RicksupportsMonica您可以直接使用d
作为相应的TypedDict
,即使不将其分配给其他变量。这里需要注意的是,即使在设置项目之前,类型检查器也会假定它是D
,因此它不会对过早访问项目发出警告。当然,使用d={}
时,早期访问密钥的错误是神秘的,不可靠的,但在某些情况下可能更可取。完美,正是我所寻找的。@RicksupportsMonica您可以直接使用d
作为相应的TypedDict
,即使不将其分配给另一个变量。这里需要注意的是,即使在设置项目之前,类型检查器也会假定它是D
,因此它不会对过早访问项目发出警告。诚然,使用d={}
时,早期访问密钥的错误是神秘的,不可靠的,但在某些情况下可能更可取。