python 我的工会崩溃了

xuo3flqw  于 2023-08-02  发布在  Python
关注(0)|答案(1)|浏览(99)

我有一段围绕一个字段编写的代码,名为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,这意味着tempstr,因此不应该导致任何问题被添加到List[str]
有没有人看到一种方法来解决这个问题,而无需在这里添加不必要的类型Assert?

chhqkbe1

chhqkbe11#

self._data[key]提取到类型保护之前的局部变量:

from typing import Dict, List, Union

# "self._data"
data: Dict[str, Union[List[str], str]] = {}

key = "a"
value = "b"

current_value = data[key]
if isinstance(current_value, list):
    current_value.append(value)
else:
    data[key] = [current_value, value]

字符串
这通过了mypy --strict的类型检查。
我不能假设self._data[key]总是计算为相同的类型,即使使用相同的键。self._data实际上是一个复杂的用户定义的子类,它可以半随机地返回不同的联合变量,甚至可以将self._datakey重新绑定到不同的对象。

相关问题