问题描述
当我使用成员具有不同类型的 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。