考虑以下独立示例:
from typing import List, Union
T_BENCODED_LIST = Union[List[bytes], List[List[bytes]]]
ret: T_BENCODED_LIST = []
当我用 mypy 测试它时,出现以下错误:
example.py:4: error: Incompatible types in assignment (expression has type "List[<nothing>]", variable has type "Union[List[bytes], List[List[bytes]]]")
这里有什么问题以及如何正确注释这个示例?
这与以下 mypy bug 有关:
该问题与使用
Union
和空列表有关。
有两种方法可以解决这个问题:
from typing import List, Union
# Define the variable with type hint
T_BENCODED_LIST: Union[List[bytes], List[List[bytes]]]
# Set the value to empty list and tell mypy to look the other way.
T_BENCODED_LIST = [] # type: ignore
这感觉像是一个合理的方法,因为它允许 mypy 继续假设类型已正确定义。
使用类型提示函数可以避免
Union
和空列表的问题。这种方法意味着添加仅解决打字问题所需的代码,因此不是我的首选方法。
from typing import List, Union
# Define the variable with type hint
T_BENCODED_LIST: Union[List[bytes], List[List[bytes]]]
# Create a type-hinted function that can be used
# for assignment.
def get_empty_list_bytes() -> List[bytes]:
return []
# Set the value to empty list using the function.
# Mypy will assume the type based on the functions type hint.
T_BENCODED_LIST = get_empty_list_bytes()