如何解决Python 类型提示:基于属性的返回类型
尝试类型提示,但我在思考某些事情时遇到了一些麻烦:
build.gradle
如何才能使 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_instance 属性返回此实例类型”,那就没问题了。
解决方法
答案是generics。通过使 Node
泛型化并使用凭据类进行参数化,您可以指定希望它们工作的类型。缺点是,最顶层的类不能为 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'
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。