You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 07:09:56