如何解决mypy 在课外的 Dict 中报告错误,但不在课内
当我使用成员具有不同类型的 dict 时,mypy 在类内接受我的类型定义,但在类外不接受。
成员'first'的访问
ExampleClass.__str__()
当我迭代它时,不会从 mypy 中产生错误。
但是当我在类外获得相同的数据时,迭代“first”会导致 mypy 产生错误。
这是怎么回事?
from typing import Union,List,Dict
from collections import namedtuple
class ExampleClass:
PrimeOption = namedtuple('PrimeOption',['value1','value2'])
PrimeList = List[PrimeOption]
ExampleData = Dict[str,Union[bool,PrimeOption]]
def __init__(self):
self.data:ExampleData = {'flag':False,'first': [ExampleClass.PrimeOption.value1]}
def get(self) -> ExampleData:
return self.data
def __str__(self):
t = self.get()
out = 'ExampleClass:'
for i in t['first']:
out += str(i)
return out
if __name__ == "__main__":
obj = ExampleClass()
print(obj)
t = obj.get()
for i in t['first']:
print(i)
$ mypy union.py union.py:33: error: Item "bool" of "Union[bool,PrimeOption]" has no attribute "__iter__" (not iterable) Found 1 error in 1 file (checked 1 source file)
我使用的是 python3.8.8 和 mypy 0.812。
编辑: 这需要使用python3.6。
解决方法
正如 Azat Ibrakov 所说,在上面的评论中,TypedDict
在 typing extension 包中被移植到 python3.6。
通过添加
from typing_extensions import TypedDict
并用
替换ExampleData
ExampleData = TypedDict('ExampleData',{'flag': bool,'first': PrimeOption})
没有报错。
更改适用于 python3.6 和 python3.8。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。