Python 类型提示:return 基于属性的类型
Python type hinting: return type based on attribute
尝试类型提示,我在思考一些问题时遇到了一些麻烦:
class Node(object):
credentials_class = credentials.BaseCredentials
@property
def credentials_instance(self) -> [credentials_class]:
return self.credentials_class(self.credentials_data)
class OtherNode(Node):
credentials_class = credentials.OtherCredentials # subclass of BaseCredentials
我怎样才能使 OtherNode().credentials_instance
returns credentials_class
中指定的类型,对于 Node
的所有子类?
credentials_class
属性不是必需的,如果我有其他方式告诉系统“此节点的 credentials_instance 属性 returns 此实例类型",那就好。
答案是generics。通过使 Node
通用并使用凭据 class 进行参数化,您可以指定您希望它们工作的类型。缺点是,最顶层的 class 无法将默认值分配给 credentials_class
,因为它会与通用冲突。
from typing import Type, Generic, TypeVar
CredentialsClassT = TypeVar("CredentialsClassT", bound=credentials.BaseCredentials)
class Node(Generic[CredentialsClassT]):
credentials_class: Type[CredentialsClassT]
@property
def credentials_instance(self) -> CredentialsClassT:
return self.credentials_class(self.credentials_data)
# example usage
class BaseNode(Node[credentials.BaseCredentials]):
credentials_class = credentials.BaseCredentials
class OtherNode(Node[credentials.OtherCredentials]):
credentials_class = credentials.OtherCredentials # subclass of BaseCredentials
输入到位,例如
reveal_type(OtherNode.credentials_instance)
将使 MyPy 按预期打印 not: Revealed type is 'credentials.OtherCredentials'
。
尝试类型提示,我在思考一些问题时遇到了一些麻烦:
class Node(object):
credentials_class = credentials.BaseCredentials
@property
def credentials_instance(self) -> [credentials_class]:
return self.credentials_class(self.credentials_data)
class OtherNode(Node):
credentials_class = credentials.OtherCredentials # subclass of BaseCredentials
我怎样才能使 OtherNode().credentials_instance
returns credentials_class
中指定的类型,对于 Node
的所有子类?
credentials_class
属性不是必需的,如果我有其他方式告诉系统“此节点的 credentials_instance 属性 returns 此实例类型",那就好。
答案是generics。通过使 Node
通用并使用凭据 class 进行参数化,您可以指定您希望它们工作的类型。缺点是,最顶层的 class 无法将默认值分配给 credentials_class
,因为它会与通用冲突。
from typing import Type, Generic, TypeVar
CredentialsClassT = TypeVar("CredentialsClassT", bound=credentials.BaseCredentials)
class Node(Generic[CredentialsClassT]):
credentials_class: Type[CredentialsClassT]
@property
def credentials_instance(self) -> CredentialsClassT:
return self.credentials_class(self.credentials_data)
# example usage
class BaseNode(Node[credentials.BaseCredentials]):
credentials_class = credentials.BaseCredentials
class OtherNode(Node[credentials.OtherCredentials]):
credentials_class = credentials.OtherCredentials # subclass of BaseCredentials
输入到位,例如
reveal_type(OtherNode.credentials_instance)
将使 MyPy 按预期打印 not: Revealed type is 'credentials.OtherCredentials'
。