如何让VS Code Python智能感知识别动态修改的函数文档字符串?
当然可行!不过要注意:VS Code的智能提示(基于Pylance/Pyright)默认依赖静态代码分析,不会实时运行你的装饰器代码来更新文档字符串,所以动态修改的__doc__才没法被识别。下面给你几个实用的解决办法:
1. 静态合并文档字符串(最靠谱)
直接放弃动态修改,在函数定义里手动合并两个函数的文档字符串,这样Pylance能立刻识别到完整内容:
import core def newfunc(base, **kwargs): """Returns data from :func:`~core.otherfunc` {core.otherfunc.__doc__} """ return core.otherfunc(base, **kwargs)
要是不想手动复制,可以用预提交钩子或者代码生成脚本,在core.otherfunc的文档变更时自动更新合并后的内容。
2. 显式静态赋值__doc__
就算用自定义的wraps装饰器,也可以在函数定义后加一行静态的__doc__赋值,Pylance能解析到这个静态修改:
import core from your_module import wraps @wraps(core.otherfunc) def newfunc(base, **kwargs): """Returns data from :func:`~core.otherfunc`""" return core.otherfunc(base, **kwargs) # 让Pylance能识别的静态赋值 newfunc.__doc__ = "\n".join([newfunc.__doc__, core.otherfunc.__doc__])
这样既保留了装饰器的逻辑,又给静态分析工具提供了它需要的合并后文档字符串。
3. 结合functools.wraps加类型提示
如果你改用functools.wraps,可以补充一个类型断言来提示合并后的文档字符串。虽然不是完美方案,但能帮助Pylance关联目标函数的文档:
from functools import wraps import core @wraps(core.otherfunc) def newfunc(base, **kwargs): """Returns data from :func:`~core.otherfunc` """ return core.otherfunc(base, **kwargs) # 告诉分析器这个函数继承了core.otherfunc的文档字符串 newfunc: type(core.otherfunc) = newfunc
这个类型断言会让分析器把newfunc视为和core.otherfunc拥有相同类型(以及对应的文档字符串)。
4. 调整Pylance设置确保模块被正确识别
首先要保证VS Code能正确识别你的core模块:
- 把项目根目录添加到Python路径(通过设置里的
python.analysis.extraPaths)。 - 开启
python.analysis.useLibraryCodeForTypes,让Pylance能从本地模块读取文档字符串。
这些设置能确保Pylance先获取到core.otherfunc的文档字符串,后续的静态合并或提示才能更好地生效。
内容的提问来源于stack exchange,提问作者terry87
相关产品推荐
相关产品推荐

