VSCode中的前向函数签名



假设我在src/f1.py中有一个具有以下签名的函数:


def my_func(a1: int, a2: bool) -> float:
...

在一个单独的文件src/f2.py中,我创建了一个字典:

from src.f1 import my_func
my_dict = {
"func": my_func
}

在我的最终文件src/test1.py中,我调用函数:

from src.f2 import my_dict
print(my_dict["func"](1, True))

我在src/f2.py中得到了my_func的IDE自动建议,但在src/test1.py中没有。我尝试过使用typing.Callable,但它没有创建相同的签名,并且丢失了函数文档。有没有什么方法可以在不改变代码结构的情况下在src/test1.py中获得这些?我不想更改声明函数、字典或测试的文件。

我使用VSCode版本1.73.1和Python版本3.8.13。我无法更改我的Python版本。

我尝试创建不同类型的Callable对象,但在获得所需结果时遇到了问题。

  1. 他们似乎没有文档字符串支持
  2. 有些类型是可选的。我不能让它发挥作用
  3. 它们不适用于变量名,只适用于数据类型。我希望变量名(函数的参数名)在IDE建议中

我到底想做什么

我正在尝试实现一种机制,用户可以在单个文件中设置库的配置。这个文件是存储所有字典的地方(它导入所有基本函数)。

这个";配置字典";在主python文件中调用(或在任何需要的地方)。我在一组文件中有一些功能,用于完成一组特定的任务。说出任务A的函数fa1fa2;任务Bfb1fb2fb3;任务C的fc1。我想要任务A的配置(选项),然后是B,然后是C。所以我做

work_ABC = {"A": fa1, "B": fb2, "C": fc1};

现在,我有一个类似的功能

wd = work_ABC
def do_work_abc(i, do_B=True):
res_a = wd["A"](i)
res_b = res_a
if do_B:
res_b = wd["B"](res_a)
res_c = wd["C"](res_b)
return res_c

如果你有一个更有效的方法,我可以实现同样的事情,我很乐意听到它。

我希望IntelliSense为我提供字典的函数集的函数签名。

Python中没有覆盖函数的文档字符串或参数名称的类型注释构造。甚至没有一个只用于位置或只用于关键字的参数(这在类型意义上实际上是有意义的)。

正如我在评论中已经提到的,文档字符串和名称与类型无关。归根结底,这是一个IDE问题。例如,PyCharm可以通过您提供的设置来推断这些细节。我得到了带有参数名称的my_dict["func"]的自动建议,因为PyCharm足够智能/足够重,可以跟踪它到源。但它也有其局限性。如果我将f2中的代码更改为:

from src.f1 import my_func
_other_dict = {
"func": my_func
}
my_dict = {}
my_dict.update(_other_dict)

然后建议引擎就丢失了。

原因只是运行时分析和静态分析之间的差异。在某些情况下,期望静态分析工具为您运行代码会变得愚蠢/不合理。这就是为什么我总是说:

静态类型检查器不执行您的代码,他们只是读取它。

甚至PyCharm"知道";CCD_ 22的签名和您的设置要求它在后台运行一些非平凡的代码,以从字典键到字典,再到实际的函数定义。

简而言之:看来你对VSCode运气不佳。参数名称和文档字符串不属于类型系统。

相关内容

  • 没有找到相关文章

最新更新