如何使用泛型类型的构造函数
How to use constructor of Generic type
如何使用 python 通用类型 class 的构造函数?
T = typing.TypeVar('T')
class MyClass(typing.Generic[T]):
def __init__(self, initialValue: typing.Iterable):
self.values: T = T(initialValue)
test = MyClass[tuple[int]]([1, 2, 3])
在这种情况下,我希望 T(initialValue)
等同于 tuple(initialValue)
,但我得到了一个错误。 “发生异常:TypeError
'TypeVar' 对象不可调用
我想这并不奇怪,因为这不是构建打字的目的,但是否有解决方法来实现这一点?
您需要采用显式工厂方法。类型注释仅用于 compile-time 目的,在运行时 T
是 只是 一个 TypeVar
。考虑
class MyClass(Generic[T]):
def __init__(self, initialValue: Iterable[int], factory: Callable[[Iterable[int]], T]):
self.values: T = factory(initialValue)
然后称它为
test = MyClass([1, 2, 3], lambda x: tuple(x))
注意: 将 tuple
作为第二个参数传递会很好,但是 mypy
在将该类型名称转换为 Callable
。其他类型检查器也许能够处理它;您的里程可能会有所不同。
如何使用 python 通用类型 class 的构造函数?
T = typing.TypeVar('T')
class MyClass(typing.Generic[T]):
def __init__(self, initialValue: typing.Iterable):
self.values: T = T(initialValue)
test = MyClass[tuple[int]]([1, 2, 3])
在这种情况下,我希望 T(initialValue)
等同于 tuple(initialValue)
,但我得到了一个错误。 “发生异常:TypeError
'TypeVar' 对象不可调用
我想这并不奇怪,因为这不是构建打字的目的,但是否有解决方法来实现这一点?
您需要采用显式工厂方法。类型注释仅用于 compile-time 目的,在运行时 T
是 只是 一个 TypeVar
。考虑
class MyClass(Generic[T]):
def __init__(self, initialValue: Iterable[int], factory: Callable[[Iterable[int]], T]):
self.values: T = factory(initialValue)
然后称它为
test = MyClass([1, 2, 3], lambda x: tuple(x))
注意: 将 tuple
作为第二个参数传递会很好,但是 mypy
在将该类型名称转换为 Callable
。其他类型检查器也许能够处理它;您的里程可能会有所不同。