[英]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
返回在credentials_class
中为Node
的所有子类指定的类型?
credentials_class
属性不是必需的,如果我有其他方法可以告诉系统“此节点的 credentials_instance 属性返回此实例类型”,那很好。
答案是generics 。 通过使用凭据 class 使Node
通用化并参数化,您可以指定希望它们工作的类型。 不利的一面是,最上面的 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'
正如预期的那样。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.