Как ввести функцию, которая может принимать список или кортеж из списка или кортежа? - PullRequest
0 голосов
/ 09 июля 2019

Я пытаюсь определить функцию, которая может принимать контейнеры контейнеров объектов, и мне все равно, являются ли контейнеры кортежами или списками.

(я знаю, что мог бы пройти через трудности с реализацией этого , но я не хочу, и я все еще не уверен, решит ли это мою проблему.)

Итак, у меня есть следующий код:

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) состоит в том, что оно имеет отношение к List s, являющемуся инвариантом , но с этим комплексом примера я не могу понять, как.

У меня нет идей для (2), кроме возможной реализации ранее упомянутой проблемы, которая позволила бы мне избавиться от Union s, которые, я подозреваю, могут быть частью проблемы.

...