如何提取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 - 过滤掉隐式调用的函数,只保留代码中显式写出的目标函数
- 遍历代码的AST节点,筛选出所有
用rope的大致步骤:
- 安装rope:
pip install rope - 创建rope项目对象,加载要分析的Python文件
- 遍历文件中的所有函数调用节点,通过rope的符号解析功能获取完整的函数路径
- 收集这些路径并去重,得到最终结果
另外,rope会自动处理导入关系,比如你写了import numpy as np,它能把np.linalg.norm关联到真实的模块路径,再转换成你需要的np.linalg.norm格式。
需要注意的是,不管用哪种方法,都要区分函数调用和单纯的属性访问——比如np.linalg是属性访问但未调用,只有带()的np.linalg.norm()`才是需要提取的目标。
内容的提问来源于stack exchange,提问作者Pritam
相关产品推荐
相关产品推荐

