如何在类声明前为其使用的类型创建别名?
Python 类型别名引用未定义类的解决办法
我需要给typing.Callable[[C], int]创建类型别名,但直接在类定义前声明会触发“C未定义”的错误;如果把别名放在类定义后,又无法在C类内部的方法注解中使用。实际代码里这个类型逻辑复杂,必须用别名简化。
原始代码
import typing class C(): def __init__(self, callback: typing.Callable[[C], int]): self._callback = callback def getCallback() -> typing.Callable[[C], int]: return self._callback class C2(): def __init__(self, cInstance: C): self._cInstance = cInstance def f() -> typing.NoReturn: self._cInstance.getCallback()(self.cInstance)
错误尝试
import typing CallbackType = typing.Callable[[C], int] # ERROR: C not defined class C(): def __init__(self, callback: CallbackType): self._callback = callback def getCallback() -> CallbackType: return self._callback class C2(): def __init__(self, cInstance: C): self._cInstance = cInstance def f() -> typing.NoReturn: self._cInstance.getCallback()(self.cInstance)
可行解决方案
方案1:字符串字面量前向引用(Python 3.7+)
用字符串包裹未定义的类名,Python类型检查器(如mypy)支持这种前向引用写法:
import typing # 用字符串"[C]"标记未定义的类 CallbackType = typing.Callable[["C"], int] class C(): def __init__(self, callback: CallbackType): self._callback = callback def getCallback(self) -> CallbackType: # 修复:添加self参数 return self._callback class C2(): def __init__(self, cInstance: C): self._cInstance = cInstance def f(self) -> typing.NoReturn: # 修复:添加self参数 self._cInstance.getCallback()(self._cInstance) # 修复:引用正确的实例属性
方案2:使用TypeVar绑定(Python 3.11+)
借助typing.TypeVar明确绑定类类型,写法更严谨:
import typing from typing import Self # 定义绑定到C类的TypeVar CType = typing.TypeVar("CType", bound="C") CallbackType = typing.Callable[[CType], int] class C(): def __init__(self, callback: CallbackType): self._callback = callback def getCallback(self) -> CallbackType: return self._callback class C2(): def __init__(self, cInstance: C): self._cInstance = cInstance def f(self) -> typing.NoReturn: self._cInstance.getCallback()(self._cInstance)
方案3:类内部定义别名(仅类内使用场景)
如果别名仅在C类内部使用,可以直接在类作用域内定义:
import typing class C(): # 类内部定义类型别名 CallbackType = typing.Callable[["C"], int] def __init__(self, callback: CallbackType): self._callback = callback def getCallback(self) -> CallbackType: return self._callback class C2(): def __init__(self, cInstance: C): self._cInstance = cInstance def f(self) -> typing.NoReturn: # 外部使用需通过类名引用别名 self._cInstance.getCallback()(self._cInstance)
内容的提问来源于stack exchange,提问作者FalcoGer
相关产品推荐
相关产品推荐

