Joe*_*ley 8 python covariance type-hinting
我正在尝试实现一个用于类型之间转换的接口,但由于typing.Type是协变的,我正在努力使其保持一致
U = TypeVar('U')
class Into(Protocol[U]):
@abstractmethod
def into(self, t: Type[U]) -> U:
pass
Run Code Online (Sandbox Code Playgroud)
该文档给出一个类似的例子有一个关键的区别
class User: ...
class BasicUser(User): ...
class ProUser(User): ...
class TeamUser(User): ...
def make_new_user(user_class: Type[User]) -> User:
return user_class()
Run Code Online (Sandbox Code Playgroud)
他们说类型检查器应该检查所有的子类是否User应该实现一个带有有效签名的构造函数,以便像这样实例化。我的用例不同,因为我可能不会构建新类型,只是返回一个预先存在的类型。说我同意
class X: pass
class Wrapper:
def __init__(self, x: X):
self._x = x
def into(self, t: Type[X]) -> X:
return self._x
Run Code Online (Sandbox Code Playgroud)
一切正常,直到有人子类化 X
w = Wrapper(X())
...
class XX(X): pass
x: XX = w.into(XX)
Run Code Online (Sandbox Code Playgroud)
RHS 很好,因为 mypy cosType是协变的,但显然 API 已损坏,因为X它不是XX. 如果Type不是协变的,这不会是一个问题:RHSWrapper在更新以支持之前不会进行类型检查XX.
我的问题是:鉴于 的协方差,是否有某种方法可以实现这一点(或类似的东西)Type?
语境
我想用它来将一个类型转换为多种其他类型,明确指定所需的类型,而不仅仅是into_X,into_Y等等。我希望用TypeVaror来做到这一点overload。我在那里也有困难。
这是受 rust 的启发Into,其中t: Type[U]是类型参数而不是函数参数。
Kat*_*ova -2
eval解决了这个问题。
class Wrapper:
def __init__(self, x: X):
self._x = x
def into(self, t: Type[X]) -> X:
return eval(f'{t}({self._x})')
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
157 次 |
| 最近记录: |