PyCharm:来自预先存在的方法提示的函数的 Typedef 提示

PyCharm: Typedef hint for function from pre-existing method's hint

简介

假设以下代码:

import typing


class Foo:
    def __init__(self, l_key: str = "1234"):
        self.key = l_key

    def get_key(self) -> str:
        return self.key


dictOfFoos = typing.Dict[typing.get_type_hints(Foo.get_key)['return'], Foo]


def test_return() -> dictOfFoos:
    test = dict()
    test["123"] = Foo()
    return test


test_return()

print("0 " + str(type(Foo().key)))
print("1 " + str(typing.get_type_hints(Foo.get_key)['return']))
print("2 " + str(typing.get_type_hints(test_return)['return']))

输出如下:

0 <class 'str'>
1 <class 'str'>
2 typing.Dict[str, __main__.Foo]

现在,当我按 Ctr+Q 显示“快速文档”时,会显示以下工具提示。

来自 test_run() 函数的 return 值的提示:

test_run() 函数的提示:

我明白 IDE 不会 运行 typing.get_type_hints(Foo.key)['return']Foo.key 方法中获取 return 类型的类型,因为这是 运行 仅在 运行 时间。

问题

假设 Foo.key 将来会发生变化,是否有任何方法可以定义基于 class 中方法提示的类型提示? 基本上有这样的提示:

def test_run() -> Dict[str, Foo]

Miyagi 先生有很好很简单的解决方案:

def test_return_v2():
    foo = Foo()
    return {foo.get_key(): foo}

哪个生成了正确的提示:

但我一直在专门寻找类型提示,因为我想编写没有实现但定义要在继承中覆盖的方法的接口方法类(我当然应该提到的问题,抱歉):

def get_key(self) -> str:
    pass

type函数声明类型就够了:

dictOfFoos2 = typing.Dict[type(Foo.get_key()), Foo]


def test_return_v3() -> dictOfFoos2:
    test = dict()
    test["123"] = Foo()
    return test