Python: общие ограничения (ограничения не могут быть параметризованы переменными типа) - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу создать гибкий тип, который представляет "экземпляр X" или "Iterable of X." Фактически, один или более типов с небольшим добавлен семантический сахар, так что вы можете передать один экземпляр, не заключая его в итерацию.

Вот что у меня есть:

X = TypeVar('X')

# This works. flex_iter('foo') returns an Iterator[str]
FlexIterable = Union[X, Iterable[X]]
def flex_iter(x: FlexIterable) -> Iterator[X]:
    for item in ([x] if not isinstance(x, Iterable) else x):
        yield item

# This doesn't work -- but I reeeaaally wish it did.
FlexIterable = TypeVar('FlexIterable', X, Iterable[X])
def some_other_func_that_uses_ints(x: FlexIterable[int]):
    pass

Во втором случае средство проверки типа Pycharm сообщает Constraints cannot be parameterized by type variables для FlexIterable = TypeVar('FlexIterable', X, Iterable[X]).

Кто-нибудь найдет способ обойти это? Или кто-нибудь видит, как я могу лучше структурировать это?

...