检测Python函数中的所有全局变量?

2024-01-01

我正在尝试分析一些混乱的代码,这些代码恰好在函数中大量使用全局变量(我正在尝试重构代码,以便函数仅使用局部变量)。有没有办法检测函数内的全局变量?

例如:

def f(x):
    x = x + 1
    z = x + y
    return z

这里的全局变量是y因为它不是作为参数给出的,也不是在函数中创建的。

我尝试使用字符串解析来检测函数内的全局变量,但它变得有点混乱;我想知道是否有更好的方法来做到这一点?

编辑:如果有人感兴趣,这是我用来检测全局变量的代码(基于 kindall 的答案和 Paolo 对这个问题的回答:从 Python 脚本中捕获标准输出 https://stackoverflow.com/questions/5136611/capture-stdout-from-a-script-in-python):

from dis import dis

def capture(f):
    """
    Decorator to capture standard output
    """
    def captured(*args, **kwargs):
        import sys
        from cStringIO import StringIO

        # setup the environment
        backup = sys.stdout

        try:
            sys.stdout = StringIO()     # capture output
            f(*args, **kwargs)
            out = sys.stdout.getvalue() # release output
        finally:
            sys.stdout.close()  # close the stream 
            sys.stdout = backup # restore original stdout

        return out # captured output wrapped in a string

    return captured

def return_globals(f):
    """
    Prints all of the global variables in function f
    """
    x = dis_(f)
    for i in x.splitlines():
        if "LOAD_GLOBAL" in i:
            print i

dis_ = capture(dis)

dis_(f)

dis默认情况下不返回输出,所以如果你想操纵输出dis作为字符串,您必须使用 Paolo 编写并发布在此处的捕获装饰器:从 Python 脚本中捕获标准输出 https://stackoverflow.com/questions/5136611/capture-stdout-from-a-script-in-python


检查字节码。

from dis import dis
dis(f)

Result:

  2           0 LOAD_FAST                0 (x)
              3 LOAD_CONST               1 (1)
              6 BINARY_ADD
              7 STORE_FAST               0 (x)

  3          10 LOAD_FAST                0 (x)
             13 LOAD_GLOBAL              0 (y)
             16 BINARY_ADD
             17 STORE_FAST               1 (z)

  4          20 LOAD_FAST                1 (z)
             23 RETURN_VALUE

全局变量将有一个LOAD_GLOBAL操作码而不是LOAD_FAST。 (如果函数改变任何全局变量,将会出现STORE_GLOBAL操作码也是如此。)

通过一些工作,您甚至可以编写一个函数来扫描函数的字节码并返回它使用的全局变量的列表。实际上:

from dis import HAVE_ARGUMENT, opmap

def getglobals(func):
    GLOBAL_OPS = opmap["LOAD_GLOBAL"], opmap["STORE_GLOBAL"]
    EXTENDED_ARG = opmap["EXTENDED_ARG"]

    func = getattr(func, "im_func", func)
    code = func.func_code
    names = code.co_names

    op = (ord(c) for c in code.co_code)
    globs = set()
    extarg = 0

    for c in op:
        if c in GLOBAL_OPS:
            globs.add(names[next(op) + next(op) * 256 + extarg])
        elif c == EXTENDED_ARG:
            extarg = (next(op) + next(op) * 256) * 65536
            continue
        elif c >= HAVE_ARGUMENT:
            next(op)
            next(op)

        extarg = 0

    return sorted(globs)

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

检测Python函数中的所有全局变量? 的相关文章

  • Python 中的 Lanczos 插值与 2D 图像

    我尝试重新缩放 2D 图像 灰度 图像大小为 256x256 所需输出为 224x224 像素值范围从 0 到 1300 我尝试了两种使用 Lanczos 插值来重新调整它们的方法 首先使用PIL图像 import numpy as np
  • 如何在flask中使用g.user全局

    据我了解 Flask 中的 g 变量 它应该为我提供一个全局位置来存储数据 例如登录后保存当前用户 它是否正确 我希望我的导航在登录后在整个网站上显示我的用户名 我的观点包含 from Flask import g among other
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • 是否存在 IsCallable 为 false 但 IsConstructor 为 true 的 JS 对象?

    ECMAScript 规范函数可调用 https www ecma international org ecma 262 6 0 index html sec iscallable当且仅当其参数具有 Call 内部方法时返回 true 它在
  • 使用 on_bad_lines 将 pandas.read_csv 中的无效行写入文件

    我有一个 CSV 文件 我正在使用 Python 来解析该文件 我发现文件中的某些行具有不同的列数 001 Snow Jon 19801201 002 Crom Jake 19920103 003 Wise Frank 19880303 l
  • 如何加速Python中的N维区间树?

    考虑以下问题 给定一组n间隔和一组m浮点数 对于每个浮点数 确定包含该浮点数的区间子集 这个问题已经通过构建一个解决区间树 https en wikipedia org wiki Interval tree 或称为范围树或线段树 已经针对一
  • 如何使用 OpencV 从 Firebase 读取图像?

    有没有使用 OpenCV 从 Firebase 读取图像的想法 或者我必须先下载图片 然后从本地文件夹执行 cv imread 功能 有什么办法我可以使用cv imread link of picture from firebase 您可以
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • 如何在 C 中调用采用匿名结构的函数?

    如何在 C 中调用采用匿名结构的函数 比如这个函数 void func struct int x p printf i n p x 当提供原型的函数声明在范围内时 调用该函数的参数必须具有与原型中声明的类型兼容的类型 其中 兼容 具有标准定
  • 为字典中的一个键附加多个值[重复]

    这个问题在这里已经有答案了 我是 python 新手 我有每年的年份和值列表 我想要做的是检查字典中是否已存在该年份 如果存在 则将该值附加到特定键的值列表中 例如 我有一个年份列表 并且每年都有一个值 2010 2 2009 4 1989
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 发送用户注册密码,django-allauth

    我在 django 应用程序上使用 django alluth 进行身份验证 注册 我需要创建一个自定义注册表单 其中只有一个字段 电子邮件 密码将在服务器上生成 这是我创建的表格 from django import forms from
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python Selenium:如何在文本文件中打印网站上的值?

    我正在尝试编写一个脚本 该脚本将从 tulsaspca org 网站获取以下 6 个值并将其打印在 txt 文件中 最终输出应该是 905 4896 7105 23194 1004 42000 放置的动物 的 HTML span class
  • NotImplementedError:无法将符号张量 (lstm_2/strided_slice:0) 转换为 numpy 数组。时间

    张量流版本 2 3 1 numpy 版本 1 20 在代码下面 define model model Sequential model add LSTM 50 activation relu input shape n steps n fe

随机推荐

  • 如果 WooCommerce 结帐中存在特定产品类别,请删除其他产品

    我正在为客户创建一个登陆页面 并使用具有以下类别的特定产品landing page 我希望当前在购物车页面上的其他产品在类别时被删除landing page存在于购物车中 这是片段 现在 它删除了其中的所有产品 因为 woocommerce
  • 按组向原始数据添加一列平均值[重复]

    这个问题在这里已经有答案了 我想添加一列基于因子列的均值列R data frame 像这样 df1 lt data frame X rep x LETTERS 1 2 each 3 Y 1 6 df2 lt aggregate data d
  • 如何根据命令更改视图+视图模型

    我刚刚开始了解整个 WPF 事物 需要了解一些基本元素 到目前为止 我已经了解了 MVVM 模式中的模型 视图和 ViewModel 我不明白的是在哪里 如何根据此更改我的用户界面 假设我有一个需要先登录的应用程序 我的登录是一个视图和一个
  • 注释 Mptt 模型的下降总数

    Question 给定下面的模型 我想获取所有页面的查询集 并用与页面关联的线程中的评论总数进行注释 包括与页面关联的评论线程树中的所有评论 我在用Django mptt https django mptt readthedocs io e
  • “对私有方法的致命错误调用”但方法受到保护

    第一次在 PHP 中扩展一个类 我收到一个致命错误 提示该方法是私有的 而实际上它不是 我确信这是基本的东西 但我研究过书籍和论坛 但我无法确定我做了什么来产生这个错误 非常感谢任何帮助 详情如下 错误信息 致命错误 从第 726 行 ro
  • Bootstrap v4 中的“p-N”及其变体代表什么?

    我发现 Bootstrap v4 中的命名不太直观 我知道他们希望最大限度地减少所有类使标记混乱的影响 但我无法得出合理的结论 我可以猜测 但我找不到具体的答案 p 1 p 2 p N Flexbox 相关 但是什么是p代表 d flex
  • 通过代理的 XMLDocument.Load(url)

    我有一些代码基本上使用 XMLDocument Load uri 方法读取 XML 文档 该方法运行良好 但如果通过代理进行调用 则效果不佳 我想知道是否有人知道通过代理进行此调用 或达到相同效果 的方法 这是我最终使用的代码 WebPro
  • 使用 php 绘制图表

    我需要制作图表 饼图和条形图 并使用 php 数据 数据是 JSON 编码的 生成图表的最佳方法是什么 我现在正在查看 Google Chart api 还有什么比这更好 读作 更容易 的吗 pChart http pchart sourc
  • +[NSObject初始化]内部的dispatch_once是否过度杀伤?

    如果我在其中创建一个单例 NSObject initialize 我需要将我的代码放入dispatch once像这样阻止 static NSObject Bar implementation Foo void initialize if
  • 命名管道:C# 服务器、C++ 客户端

    我编写了两对命名管道客户端 服务器程序 C NET 4 中的第一对 C 中的第二对 非托管 所有 4 个测试程序都使用相同的管道名称 pipe mypipe C 对彼此工作得很好 我从客户端发送一条消息 服务器接收该消息 C 对也可以很好地
  • 在 For 循环内使用 IF 条件检查时如何丢弃数据表中的空值

    在我的项目中 我根据数据库中的某些条件选择用户 ID 并将其保存在数据表中 并使用基于条件的用户输入的 ID 进行检查 只会获取 5 行 但在循环中和 IF 条件下 它正在检查第 6 行为空 因此它抛出异常 位置 6 处没有行 我的代码是
  • ie8 和 ie7 的 2 列 div

    我想要一行有 2 个单元格 该行和 2 个单元格必须以百分比表示 我曾尝试这样做 container width 100 display inline table sidebar1 float left width 30 mainConte
  • 如何在 Swift 中正确设置像 imageContacts 这样的圆形 imageView?

    我想在 imageView 中显示图片 就像图像联系人 在圆圈中 但是当我尝试显示它时 imageView 会重新调整其大小 并且在圆圈中无法正确显示 image layer borderWidth 1 0 image layer mask
  • 有哪些重构方法可以减少编译代码的大小?

    我有一个需要新功能的旧固件应用程序 应用程序的大小已经接近设备的有限闪存容量 而少数新功能和变量将其推向极限 打开编译器优化确实可以解决问题 但客户对此持谨慎态度 因为它们过去曾导致过失败 那么 在重构 C 代码以产生更小的输出时 需要注意
  • JOIN 或 WHERE 中的条件

    在 JOIN 子句中添加条件与在 WHERE 子句中添加条件之间是否有任何区别 性能 最佳实践等 例如 Condition in JOIN SELECT FROM dbo Customers AS CUS INNER JOIN dbo Or
  • 反应流与反应堆模式?

    我想知道反应流 由反应宣言定义 和反应器模式 https en wikipedia org wiki Reactor pattern https en wikipedia org wiki Reactor pattern 我读到 Proje
  • 从 Chrome 中打开的
    元素中删除蓝色边框?

    我正在升级我的网站以使用新的 HTML5details元素以获得更好的可访问性 一切正常 但不幸的是 当我单击打开元素时 Chrome 应用了丑陋的蓝色边框 有什么办法可以阻止 Chrome 这样做吗 我看不到任何显式的 CSS 样式被应用
  • 如何使用 apache POI 在 ms word doc 中使用 rowspan 和 colspan 创建表?

    我正在使用 APACHE POI 创建包含表的 Word 文档 表格如下所示 我想创建具有行跨度和列跨度的单元格 如图所示 可以使用 APACHE POI 吗 有没有其他java库可以实现同样的功能 任何帮助表示赞赏 你可以试试这个 pub
  • 在 Android 4.0.3 中插入​​错误 SqLite [重复]

    这个问题在这里已经有答案了 我的 Android 4 0 3v 平板电脑出现 Sqlite 问题 Error 07 28 14 28 18 495 6995 7125 com titan tablet E AndroidRuntime FA
  • 检测Python函数中的所有全局变量?

    我正在尝试分析一些混乱的代码 这些代码恰好在函数中大量使用全局变量 我正在尝试重构代码 以便函数仅使用局部变量 有没有办法检测函数内的全局变量 例如 def f x x x 1 z x y return z 这里的全局变量是y因为它不是作为