假设我在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
对象,但在获得所需结果时遇到了问题。
- 他们似乎没有文档字符串支持
- 有些类型是可选的。我不能让它发挥作用
- 它们不适用于变量名,只适用于数据类型。我希望变量名(函数的参数名)在IDE建议中
我到底想做什么
我正在尝试实现一种机制,用户可以在单个文件中设置库的配置。这个文件是存储所有字典的地方(它导入所有基本函数)。
这个";配置字典";在主python文件中调用(或在任何需要的地方)。我在一组文件中有一些功能,用于完成一组特定的任务。说出任务A
的函数fa1
和fa2
;任务B
的fb1
、fb2
和fb3
;任务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运气不佳。参数名称和文档字符串不属于类型系统。