Я хочу создать гибкий тип, который представляет "экземпляр 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])
.
Кто-нибудь найдет способ обойти это? Или кто-нибудь видит, как я могу лучше структурировать это?