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

如何提取Python脚本中显式调用的所有函数?

问题:提取Python脚本中显式调用的函数

假设有如下Python脚本:

import numpy as np
x = [1, 2, 5, 3, 9, 6]
x.sort()
print(np.sum(x))

预期提取出的已调用函数为 list.sort, np.sum, print。

当前思路是列出所有内置函数,结合dir(numpy)扩展列表后检查代码中是否存在,但遇到np.linalg.norm(x)这类嵌套模块的函数时,norm不会被dir(numpy)返回,无法识别。

注:仅需要提取代码中显式出现、VSCode Dark+主题中呈黄色高亮的函数,忽略如list.__init__这类隐式调用的函数。请问是否可以用rope工具解决此问题?


解决方案

先给你个准信:rope工具完全能解决这个问题。它是专门做Python代码分析、重构的库,能精准识别代码里的符号引用,包括np.linalg.norm这种嵌套模块下的函数调用,不会像dir(numpy)那样只局限于顶层模块的符号。

具体实现思路:

  • rope会构建代码的抽象语法树(AST)并追踪符号的完整路径,遇到np.linalg.norm(x)这类嵌套调用时,能准确解析出这是numpy子模块linalg下的norm函数,不会遗漏。
  • 如果你不想额外安装库,用Python内置的ast模块自己写逻辑也可行:
    • 遍历代码的AST节点,筛选出所有Call类型的节点(即实际的函数调用)
    • 解析每个调用节点的完整路径,比如x.sort()对应list.sort,np.sum(x)对应np.sum
    • 过滤掉隐式调用的函数,只保留代码中显式写出的目标函数

用rope的大致步骤:

  1. 安装rope:pip install rope
  2. 创建rope项目对象,加载要分析的Python文件
  3. 遍历文件中的所有函数调用节点,通过rope的符号解析功能获取完整的函数路径
  4. 收集这些路径并去重,得到最终结果

另外,rope会自动处理导入关系,比如你写了import numpy as np,它能把np.linalg.norm关联到真实的模块路径,再转换成你需要的np.linalg.norm格式。

需要注意的是,不管用哪种方法,都要区分函数调用和单纯的属性访问——比如np.linalg是属性访问但未调用,只有带()的np.linalg.norm()`才是需要提取的目标。

内容的提问来源于stack exchange,提问作者Pritam

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 19:06:27