我想创建一个表示“ X的实例” 或“ X的Iterable”的灵活类型。实际上,一个或多个类型具有稍微增加了语义糖,因此您可以传递单个实例,而不必将其包装在可迭代中。
这就是我所拥有的:
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])
。
有人找到解决办法吗?还是有人看到我可以如何更好地构造它?