首页 > 解决方案 > Python 类型提示:基于属性的返回类型

问题描述

尝试类型提示,但我在解决某些问题时遇到了一些麻烦:

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 属性返回此实例类型”,那很好。

标签: pythonpython-typing

解决方案


答案是泛型。通过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)

将使 MyPynot: Revealed type is 'credentials.OtherCredentials'按预期打印。


推荐阅读