假设我有一个这样的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)这样的函数呢?由于dir(numpy)不会返回norm,我将如何找到该函数.

注意:我知道可以调用代码中没有的许多其他函数.但我只想要代码中出现的那些函数.简单地说,我希望所有的文字/令牌将被vscode在黑暗+主题中涂成黄色.有没有可能用rope来解决这个问题?

推荐答案

你可以用ast module来做这样的事情:

import ast


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

module = ast.parse(code)

for node in ast.walk(module):
    if isinstance(node, ast.Call):
        try:
            parent_name = node.func.value.id + '.'
        except AttributeError:
            parent_name = ''
        if isinstance(node.func, ast.Name):
            print(f'{parent_name}{node.func.id}')
        else:
            print(f'{parent_name}{node.func.attr}')

# output:
#  x.sort
#  print
#  np.sum

当然,有x.sort而不是list.sort,但我没有找到如何获得该方法的实际父类型.

Python相关问答推荐

对整个 pyramid 进行分组与对 pyramid 列子集进行分组

2D空间中的反旋算法

从一个系列创建一个Dataframe,特别是如何重命名其中的列(例如:使用NAs/NaN)

Python+线程\TrocessPoolExecutor

多处理队列在与Forking http.server一起使用时随机跳过项目

如何使用Pandas DataFrame按日期和项目汇总计数作为列标题

启用/禁用shiny 的自动重新加载

Geopandas未返回正确的缓冲区(单位:米)

Polars将相同的自定义函数应用于组中的多个列,

基于另一列的GROUP-BY聚合将列添加到Polars LazyFrame

Numpyro AR(1)均值切换模型抽样不一致性

需要帮助使用Python中的Google的People API更新联系人的多个字段'

Autocad使用pyautocad/comtypes将对象从一个图形复制到另一个图形

Python协议不兼容警告

为罕见情况下的回退None值键入

如何将一个文件的多列导入到Python中的同一数组中?

使用xlsxWriter在EXCEL中为数据帧的各行上色

如果列包含空值,则PANAS查询不起作用

为什么在不先将包作为模块导入的情况下相对导入不起作用

Sknowled线性回归()不需要迭代和学习率作为参数