如何键入可以接受列表或元组的列表或元组的函数?

时间:2019-07-09 05:25:18

标签: python list tuples typing mypy

我正在尝试定义一个可以容纳对象容器的函数,并且我不在乎容器是元组还是列表。

(我知道我可能会遇到实施this的麻烦,但我不想这样做,而且我仍然不确定是否能解决我的问题。)

所以,我有以下代码:

from typing import Any, Union, List, Tuple

# (list or tuple) of Any
AnyBucket = Union[List[Any], Tuple[Any, ...]]
# should be (list or tuple) of (lists or tuples) of Any
AnyBuckets = Union[List[AnyBucket], Tuple[AnyBucket, ...]]

def takes_any_buckets(inpt: AnyBuckets) -> None:
    print(inpt[0][0])

input_value: List[List[Any]] = [[1], [2]]

# Argument 1 to "takes_any_buckets" has incompatible type "List[List[Any]]";
# expected "Union[List[Union[List[Any], Tuple[Any, ...]]], Tuple[Union[List[Any], Tuple[Any, ...]], ...]]"
takes_any_buckets(input_value)

我有两个问题:

  1. Mypy为什么为此抛出错误?
  2. 我该怎么做才能获得我想要的功能(不会收到Mypy错误)?

(我不想只禁用# type: ignore的错误,我想定义一个可以使用的类型。)

我对(1)的猜测是,它与Listinvariant有关,但是由于这个复杂的示例,我不知道如何做。

除了可能实现前面提到的麻烦之外,我对(2)没有任何想法,这会使我摆脱Union,我怀疑这可能是问题的一部分。

0 个答案:

没有答案