我有一段围绕一个字段编写的代码,名为data
,其类型为Dict[str, Union[List[str], str]]
。问题是mypy正在引发错误:
from typing import Dict, List, Union
data: Dict[str, Union[List[str], str]] = {}
key = "a"
value = "b"
if isinstance(data[key], list):
data[key].append(value) # Item "str" of "Union[List[str], str]" has no attribute "append"
else:
temp = data[key]
data[key] = [temp, value] # List item 0 has incompatible type "Union[List[str], str]"; expected "str"
字符串
在其他类型语言中,我希望这能起作用。我已经在if语句的第一个分支中将类型装箱到一个列表中,因此self._data[key]
应该解析为List[str]
,而append
应该没问题。类似地,在else-branch中,self._data[key]
应该解析为str
,这意味着temp
是str
,因此不应该导致任何问题被添加到List[str]
。
有没有人看到一种方法来解决这个问题,而无需在这里添加不必要的类型Assert?
1条答案
按热度按时间chhqkbe11#
将
self._data[key]
提取到类型保护之前的局部变量:字符串
这通过了
mypy --strict
的类型检查。我不能假设
self._data[key]
总是计算为相同的类型,即使使用相同的键。self._data
实际上是一个复杂的用户定义的子类,它可以半随机地返回不同的联合变量,甚至可以将self._data
或key
重新绑定到不同的对象。