如何提取Python代码文件中使用的函数?

2024-05-05

我想创建代码文件中使用的所有函数的列表。例如,如果我们在名为“add_random.py”的文件中有以下代码

`

import numpy as np
from numpy import linalg

def foo():
    print np.random.rand(4) + np.random.randn(4)
    print linalg.norm(np.random.rand(4))

`

我想提取以下列表: [numpy.random.rand, np.random.randn, np.linalg.norm, np.random.rand]

该列表包含代码中使用的函数,其实际名称采用“module.submodule.function”的形式。 python 语言中是否有内置的东西可以帮助我做到这一点?


您可以使用以下命令提取所有调用表达式:

import ast

class CallCollector(ast.NodeVisitor):
    def __init__(self):
        self.calls = []
        self.current = None

    def visit_Call(self, node):
        # new call, trace the function expression
        self.current = ''
        self.visit(node.func)
        self.calls.append(self.current)
        self.current = None

    def generic_visit(self, node):
        if self.current is not None:
            print "warning: {} node in function expression not supported".format(
                node.__class__.__name__)
        super(CallCollector, self).generic_visit(node)

    # record the func expression 
    def visit_Name(self, node):
        if self.current is None:
            return
        self.current += node.id

    def visit_Attribute(self, node):
        if self.current is None:
            self.generic_visit(node)
        self.visit(node.value)  
        self.current += '.' + node.attr

将此与ast解析树:

tree = ast.parse(yoursource)
cc = CallCollector()
cc.visit(tree)
print cc.calls

Demo:

>>> tree = ast.parse('''\
... def foo():
...     print np.random.rand(4) + np.random.randn(4)
...     print linalg.norm(np.random.rand(4))
... ''')
>>> cc = CallCollector()
>>> cc.visit(tree)
>>> cc.calls
['np.random.rand', 'np.random.randn', 'linalg.norm']

上面的walker只处理名称和属性;如果您需要更复杂的表达式支持,则必须扩展它。

请注意,像这样收集名称是这不是一项微不足道的任务。任何间接都不会被处理。您可以在函数代码中构建一个字典来调用和动态交换函数对象,并且像上面这样的静态分析将无法跟踪它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何提取Python代码文件中使用的函数? 的相关文章

随机推荐

  • 使用 STL 迭代器而不初始化它

    我想做这样的事情 container iterator it NULL switch eSomeEnum case Container1 it vecContainer1 begin break case Container2 it vec
  • Python-打印字符串一定次数[重复]

    这个问题在这里已经有答案了 可能的重复 Python 多次打印 https stackoverflow com questions 6293421 python printing multiple times 我想知道如何打印 String
  • 从 webdriver 中的文本区域读取文本

    在用 Java 编写 webdriver 测试时 我试图从 textarea 读取文本 由于某种原因 当我使用时我得到了 null getAttribute WebElement text wd findElement By id edit
  • Objective-C 中将 重新定义为另一种符号

    我们有一堂课WayPoint 但在某个时候 我们决定将类重命名为Placemark 然而 我们并不是真的想改变类的名称 因为这会导致现有代码的大量修改 因此 我添加了一行typedef在头文件的底部并开始使用Placemark从那以后 在任
  • 如何在 Scala 中操作 JSON AST

    我正在尝试 json4s 库 基于 lift json 我想做的一件事是将 JSON 字符串解析为 AST 然后对其进行操作 例如 我想更新插入一个字段 如果该字段不存在 则将该字段插入到 AST 中 如果存在 则更新其值 我无法在文档中找
  • 将相机移动到点击的 SCNNode

    我在用着SceneKit and Swift尝试移动相机 使其 聚焦 在所选节点上 我知道我启用了 defaultCameraController 但我试图通过调整相机的位置dolly rotate and translateInCamer
  • 如何选择此“tr”中的下一个“td”? [复制]

    这个问题在这里已经有答案了 我想选择 a 的下一个兄弟姐妹td标签在一个tr元素 The tr元素是这样的 tr td Created On td td 06 28 2018 06 32 td tr 我的 XPATH 代码如下所示 text
  • 使用 Ansible 配置 EC2 实例时遇到问题

    我对如何使用 Ansible 启动 EC2 实例感到非常困惑 我正在尝试使用 ec2 py 库存脚本 我不确定应该使用哪一个 因为 Ansible 安装了三个 ansible lib ansible module utils ec2 py
  • Jquery simplemodal 关闭现有模态并打开一个新模态?

    好的 所以所有模态框的右上角都已经有一个图像来关闭它们 我怎样才能另外制作另一个锚来做同样的事情 我认为我可以使用默认为 simplemodal close 的 closeClass 选项 然后将该类添加到锚点 但它没有达到预期的效果 这是
  • 奇怪的 MSC 8.0 错误:“ESP 的值未在函数调用中正确保存...”

    我们最近尝试将一些 Visual Studio 项目分解为库 并且在测试项目中一切似乎都编译和构建得很好 其中一个库项目作为依赖项 然而 尝试运行该应用程序给我们带来了以下令人讨厌的运行时错误消息 运行时检查失败 0 ESP 的值未在函数调
  • Android TV 嵌入 youtube 1080p

    我想在我的 Android TV 应用程序上显示一些 YouTube 视频 我试图移植一些我已经在手机上运行的东西 但我使用 YouTube Android API 播放器 这似乎不适用于 Android TV 我找到了这个https co
  • Activity 在 Android 上创建两次

    首先 我是 Android 开发新手 所以请耐心等待 我将从用户界面开始 我有一个按钮 一旦您点击它 就会启动一个活动以获取结果 public class GUIActivity extends Activity Override publ
  • 如何检查一个盒子是否适合另一个盒子(允许任何旋转)

    假设我有两个盒子 每个盒子都是一个长方体 http en wikipedia org wiki Rectangular cuboid aka长方体 我需要编写一个函数来决定盒子是否具有尺寸 一 二 三 可以装入具有尺寸的盒子中 甲 乙 丙
  • 错误:将构建上传到 iTunes Connect 时,Swift 支持无效

    我正在提交 TestFlight 发行版的第一个版本 但收到以下错误 位码已关闭 其他答案似乎相当旧 所以我想我会在 2018 年重新询问 无效的 Swift 支持 文件 libswiftDarwin dylib libswiftMetal
  • 扫描图像到可读文本

    我想知道是否有一种方法可以通过编写代码来将带有文本的扫描图像转换为可读文本 那可能吗 OCRTools http www ocrtools com是我用于 net 的 对于Java 我用过Aspire http asprise com pr
  • HIVE 执行错误,从 org.apache.hadoop.hive.ql.exec.DDLTask 返回代码 1

    我在创建配置单元数据库时收到以下错误 FAILED 执行错误 从 org apache hadoop hive ql exec DDLTask 返回代码 1 com facebook fb303 FacebookService Iface
  • 将内部联接和 where 子句添加到 INSERT INTO ON DUPLICATE KEY UPDATE

    我从 INSERT INTO ON DUPLICATE KEY UPDATE MySQL 语句开始 INSERT INTO Table1 field1 field2 VALUES 1 2 ON DUPLICATE KEY UPDATE fi
  • 角度模态弹出窗口中的范围问题

    我的页面上有一个模式弹出窗口 模式弹出窗口使用引导角度库 在模式的主体内部 我有一个带有 ng model 属性的文本框 按下 确定 按钮后 我想使用该文本框值
  • 有没有 C# 到 C 的转换工具? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道 C 与 NET Framework 不同 C 是一种符合 ECMA ECMA 334 和 ISO
  • 如何提取Python代码文件中使用的函数?

    我想创建代码文件中使用的所有函数的列表 例如 如果我们在名为 add random py 的文件中有以下代码 import numpy as np from numpy import linalg def foo print np rand