Я пытаюсь определить функцию, которая может принимать контейнеры контейнеров объектов, и мне все равно, являются ли контейнеры кортежами или списками.
(я знаю, что мог бы пройти через трудности с реализацией этого , но я не хочу, и я все еще не уверен, решит ли это мою проблему.)
Итак, у меня есть следующий код:
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)
У меня два вопроса:
- Почему Mypy выдает ошибку за это?
- Что я могу сделать, чтобы получить желаемую функциональность (без ошибки Mypy)?
(я не хочу просто отключить ошибку с помощью # type: ignore
, я хочу определить тип, который будет работать.)
Мое предположение для (1) состоит в том, что оно имеет отношение к List
s, являющемуся инвариантом , но с этим комплексом примера я не могу понять, как.
У меня нет идей для (2), кроме возможной реализации ранее упомянутой проблемы, которая позволила бы мне избавиться от Union
s, которые, я подозреваю, могут быть частью проблемы.