【发布时间】:2021-09-20 08:43:00
【问题描述】:
我正在尝试完全键入提示一个函数,该函数确保一个元素在给定的字典中,然后检查元素类型是否是用户期望的。我的初始实现工作正常,如下所示
T = TypeVar("T")
def check_and_validate_element_in_dict(
element_name: str, dictionary: Dict[str, Any], element_type: Type[T]
) -> T:
assert element_name in dictionary
element = dictionary[element_name]
assert isinstance(element, element_type)
return element
它允许我替换它
assert "key1" in _dict
key1 = _dict["key1"]
assert isinstance(key1, type1)
assert "key2" in _dict
key2 = _dict["key2"]
assert isinstance(key2, type2)
有了这个
key1 = check_and_validate_element_in_dict("key1", _dict, type1)
key2 = check_and_validate_element_in_dict("key2", _dict, type2)
现在,这仅适用于要测试的元素类型只有一种,例如 int、str 等。
我还希望能够在我的函数中测试多种不同的类型,比如
isinstance(element, (int, dict))
isinstance(element, (float, type(None)))
这里的问题是类型提示函数,以使其理解如果 element_type 是单个值 T,则返回值是 T,但如果 element_type 是例如其中之一T 和U 两种类型,返回值将是T 或U。
我想这是可能的,但由于我还是类型提示领域的新手,我需要一些帮助!
编辑:
我尝试让函数支持单一类型或两种不同类型的元组作为基本情况,因此我将element_type 更新为
element_type: Union[Type[T], Tuple[Type[T], Type[T]]]
现在return element 语句被mypy 标记为错误:
Returning Any from function declared to return "T"
这也提出了一个问题:我是否需要将每个不同的输入类型指示为新的TypeVar?在这种情况下,element_type 定义变为
# using U = TypeVar("U")
def ...(..., element_type: Union[Type[T], Tuple[Type[T], Type[U]]]) -> Union[T, U]:
在这种情况下,问题一直存在
Returning Any from function declared to return "T"
【问题讨论】:
-
首先要尝试的是
element_type: Type[T] | Tuple[Type[T]]- 当你这样做时会发生什么? -
@kaya3 你对
Type[T] | Tuple[Type[T]]到底是什么意思?尤其是|,还有Tuple[Type[T]]表示一个元组里面只有一个类型 -
@HitLuca -- 在 Python 3.10 中添加了
|运算符,以便为typing.Union启用更简单的注释。 Python 3.10 中的int | float与早期版本中的Union[int, float]相同。关于tuple点,我同意——我认为这不是一个完美的解决方案。 -
对不起,我的意思是
Tuple[Type[T], ...]应该是一个任意多个元素的元组。 -
哦,我不知道
|操作,对不起,我使用的是python3.7。我其实也不知道你可以在Tuple[Type[T], ...]之类的东西中使用省略号!
标签: python type-hinting python-typing