Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将内置字典强制转换为TypedAct的类型_Python_Mypy_Typing_Python Typing - Fatal编程技术网

Python 将内置字典强制转换为TypedAct的类型

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

我有这样的东西(非常简单):

但mypy抱怨说:

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
被直接推断为“a
d
”。否则,推理会立即锁定
d
,作为
Dict[…,…]

类型在构建初始Dict之前强制转换它:

从输入import-TypeDict开始,强制转换
D=TypedDict('D',{'x':int,'y':int})
d=强制转换(d,{})
d['x']=1
d['y']=2

这确保变量
d
被直接推断为“a
d
”。否则,推断会立即锁定在
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={}
时,早期访问密钥的错误是神秘的,不可靠的,但在某些情况下可能更可取。