我该如何为泛型类中的一个带约束的方法添加类型提示?
我有一个Python方法,它只能在泛型类的一个受限子集上工作。作为一个构造示例,我可能希望以下代码中的 Spam.floatify 只对 Spam[int] 的实例可用,即便我希望存在 Spam[str] 的实例:
class Spam[T]:
def __init__(self, ham: T) -> None:
self.ham: T = ham
def floatify(self) -> float:
return float(self.ham) # Errors, but shouldn't
Spam(0).floatify()
Spam("eggs")
Spam("eggs").floatify() # Should error, but doesn't
如何编写类型提示来检查这种行为?
解决方案
你其实可以用包含该参数的类的子集来对 self 参数进行类型提示!这将拒绝对不在该子集中的实例的调用,但不会拒绝创建这些实例。在你的示例中:
class Spam[T]:
def __init__(self, ham: T) -> None:
self.ham: T = ham
def floatify(self: Spam[int]) -> float:
return float(self.ham)
Spam(0).floatify()
Spam("eggs")
Spam("eggs").floatify() # Error
(在 mypy, Pyright, ty, and Pyrefly.)
Be aware of variance. Since T is invariant, this will only work for instances of Spam[int], not for parameterizations on subtypes of int like Spam[bool]. For those, you'll need to manually type-hint the instance at instantiation if possible:
Spam(False).floatify() # Error
bool_spam: Spam[int] = Spam(False)
bool_spam.floatify() # Ok
Also, if you're on pre-3.14, that forward reference needs to be wrapped in quotes (whether manually or with from __future__ import annotations).
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。