繁体   English   中英

Python 类型提示:根据属性返回类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM