如何为Python类型注解创建可订阅的自定义类型?

sg3maiej  于 2023-04-08  发布在  Python
关注(0)|答案(1)|浏览(114)

我正在尝试为 attrib 编写一个转换器,将 Type1IterableA 转换为 IterableBType2
例如:

converter = make_iter_converter(tuple, int)
converter(["1", "2"])
>>> (1, 2)

我想给make_iter_converter函数正确地添加类型注解,但我不确定如何正确地执行。下面是我的尝试:

_ITEMS_T = TypeVar("_ITEMS_T")
_ITEM_T = TypeVar("_ITEM_T")

def make_iter_converter(
    items_converter: Callable[[Iterator], _ITEMS_T],
    item_converter: Callable[[Any], _ITEM_T],
) -> Callable:
    def wrapped(items: Iterator) -> _ITEMS_T[_ITEM_T]:
        return items_converter(item_converter(item) for item in items)

    return wrapped

然而,当我尝试使用_ITEMS_T[_ITEM_T]作为 Package 函数的返回类型时,这会引发一个错误:

TypeError: 'TypeVar' object is not subscriptable

我了解到 TypeVar 对象不能像其他类型那样使用方括号。有没有办法修复这个错误并正确地注解函数?我知道 Generic 类可以接受类型参数,但这需要定义一个单独的类,我不认为这是一个很好的解决方案。

wj8zmpe1

wj8zmpe11#

这一个工作,pylance 是能够告诉输出类型的基础上输入。

_ITEMS_T = TypeVar("_ITEMS_T")
_ITEM_T = TypeVar("_ITEM_T")

def make_iter_converter(
    items_converter: Type[_ITEMS_T],
    item_converter: Type[_ITEM_T],
) -> Callable[[Iterator], Type[_ITEMS_T][_ITEM_T]]:
    def wrapped(items: Iterator) -> Type[_ITEMS_T][_ITEM_T]:
        return items_converter(item_converter(item) for item in items)

    return wrapped

相关问题