下面是一个例子:

class Service:

    def __init__(self):
        self.data = dict()

    def get(self, clazz):
        # clazz is a class Type, and always return an instance of clazz
        return self.data[clazz]

    def register(self, clazz, *args, **kwargs):
        self.data[clazz] = clazz(*args, **kwargs)

class A:
    def method_of_a(self):
        pass

class B:
    pass

service = Service()
service.register(A)
service.register(B)

现在我完成了服务代码,并继续编写如下代码

x = service.get(A)
x.method_of_a()

代码可以工作,但有一个问题,当我编写代码时,当您输入时,IDE(在本例中为pycharm)不会显示x的函数

x.

即使我这样修改我的代码,它也不工作

def get(self, clazz):
    result: clazz = self.data[clazz]
    return result

我想知道是否有实现服务的方法,该IDE可以识别返回值的类型?

推荐答案

使用typing.TypeVartyping.Type键入--提示您的.get()函数说"如果使用T的类型调用,则返回T的一个实例":

from typing import TypeVar, Type

T = TypeVar('T')


class Service:

    def __init__(self):
        self.data = dict()

    def get(self, clazz: Type[T]) -> T:
        return self.data[clazz]

    def register(self, clazz, *args, **kwargs):
        self.data[clazz] = clazz(*args, **kwargs)


class A:
    def method_of_a(self):
        pass


s = Service()
s.register(A)

x = s.get(A)
x.method_of_a()
reveal_type(x)

使用mypy运行时,reveal_type()调用将打印出来

so73566368.py:24: note: Revealed type is "so73566368.A"

Python相关问答推荐

重命名变量并使用载体中的字符串存储 Select 该变量

使用decorator 重复超载

如何将uint 16表示为float 16

用Python获取HTML Span类中的数据

有什么方法可以避免使用许多if陈述

如何在Python中使用io.BytesIO写入现有缓冲区?

如何使用scipy从频谱图中回归多个高斯峰?

Python会扔掉未使用的表情吗?

TARete错误:类型对象任务没有属性模型'

时间序列分解

当使用keras.utils.Image_dataset_from_directory仅加载测试数据集时,结果不同

使用miniconda创建环境的问题

可变参数数量的重载类型(args或kwargs)

pandas滚动和窗口中有效观察的最大数量

如何在虚拟Python环境中运行Python程序?

名为__main__. py的Python模块在导入时不运行'

让函数调用方程

如何在Pyplot表中舍入值

在Python中计算连续天数

pandas:对多级列框架的列进行排序/重新排序