python 断言用 -O 触发

2023-12-19

我试图确保使用 -O 时 python 不会执行断言。然而,我的测试程序表明它总是被执行。我专门在命令行上使用 -O ,并且在构建和安装时运行 setup.py 时使用 -O 。在提交错误报告之前,我想确保我没有犯任何菜鸟错误......

那么我是否需要做其他事情或不同的事情,以便断言是not被处决?

我的简单脚本:

print __debug__

if __debug__:
    print "True branch"
else:
    print "False branch"

assert(False)

独立运行时有效。印刷:

False
False branch

当我在主程序中复制此代码片段时(我不能将其包含在此处...),我得到:

False
True branch
AssertionError

我完全困惑这是怎么发生的。 Mac 上的 Python 2.7.6。 (抱歉,Mac 是我的,我必须用它来工作。)


您可以通过运行来达到您所描述的效果.pyc file directly-O旗帜。这是对事物应有的运作方式的滥用。您想要:

  1. Run the .py文件有或没有-O标志(通常的方法),或
  2. Run the .pyc file without the -O旗帜,或
  3. Run the .pyo file with the -O flag.

如果你运行一个.pyc文件与-O标志,或.pyo没有它的文件,你会得到像这样的惊喜。

发生的情况是,在编译时,窥视孔优化器已经优化掉了if __debug__分支,所以.pyc or .pyo文件将无条件执行适当的分支。然后当你跑错了-O规范,您将以以下值运行__debug__这与编译时应用的优化不匹配。

有一个类似问题 http://bugs.python.org/issue8379不久前报告了 Python 问题跟踪器,尽管情况相反:有人运行.pyo文件而不使用-O flag.

一个简单的例子:假设我的当前目录中有一个类似于您的文件,名为“debug_example.py”:

noether:Desktop mdickinson$ cat debug_example.py
def main():
    print "__debug__ is {}".format(__debug__)
    if __debug__:
        print "__debug__ is True"
    else:
        print "__debug__ is False"

if __name__ == '__main__':
    main()

如果我们直接执行该文件,无论有没有-Oflag,我们看到了预期的结果:

noether:Desktop mdickinson$ python2 debug_example.py
__debug__ is True
__debug__ is True
noether:Desktop mdickinson$ python2 -O debug_example.py
__debug__ is False
__debug__ is False

现在让我们使用方便的方法将此文件编译为“debug_example.pyc”文件py_compile http://docs.python.org/library/py_compile.html模块。 (在你的情况下,这个编译可能是作为setup.py安装。):

noether:Desktop mdickinson$ python2 -m py_compile debug_example.py
noether:Desktop mdickinson$ ls -l debug_example.pyc
-rw-r--r--  1 mdickinson  staff  350 24 Mar 21:41 debug_example.pyc

现在我们执行debug_example.pyc文件,但(错误地)使用-O标志,Python 会感到困惑:

noether:Desktop mdickinson$ python2 -O debug_example.pyc
__debug__ is False
__debug__ is True

我们可以用蟒蛇的dis module http://docs.python.org/2/library/dis.html查看模块内的字节码:

Python 2.7.6 (default, Nov 18 2013, 15:12:51) 
[GCC 4.2.1 Compatible Apple LLVM 5.0 (clang-500.2.79)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import debug_example
>>> import dis
>>> dis.dis(debug_example)
Disassembly of main:
  2           0 LOAD_CONST               1 ('__debug__ is {}')
              3 LOAD_ATTR                0 (format)
              6 LOAD_GLOBAL              1 (__debug__)
              9 CALL_FUNCTION            1
             12 PRINT_ITEM          
             13 PRINT_NEWLINE       

  4          14 LOAD_CONST               2 ('__debug__ is True')
             17 PRINT_ITEM          
             18 PRINT_NEWLINE       
             19 LOAD_CONST               0 (None)
             22 RETURN_VALUE        

请注意,没有对应的字节码if那里的声明:我们看到无条件打印'__debug__ is True'.

解决办法:不要执行.pyc or the .pyo直接文件:执行.py文件并让 Python 判断是否使用.pyc or .pyo作为适当的。

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

python 断言用 -O 触发 的相关文章

  • python 中 matlibplot 中散点图的缩放轴

    我正在使用 matlibplot 进行数据可视化 我的绘图共有 6502 个数据值 运行良好 但值接近且密集 例如 我的 y 轴值范围在 3 到 10 之间 我需要清楚地获取它们之间的每个点 即像 9 2 和 9 8 这样的值至少要以 1
  • Pandas groupby:根据另一列中的值更改一列中的值

    我会尽力解释我的问题 但我是 Pandas 新手 所以请耐心等待 我有一个 Pandas 数据框df Random ID Seq ID Type Seq Token 0 8 1 User First 1 8 2 Agent Second 2
  • 使用 lxml 和 xpath 解析 xml 文件时如何保留 &

    我试图从输入 xml 文件中提取一些信息 并使用 lxml 和 xpath 指令将其打印到输出文件中 我在读取如下所示的 xml 标签时遇到问题
  • 如何在 PyCharm 社区版中运行 Django 项目的调试服务器?

    有人在 PyCharm 社区版中为 Django 项目设置调试配置时遇到问题吗 IDE 的社区版缺少项目设置中的项目类型选项 然后当我设置 调试 或 运行配置 时 它会要求我提供应该运行的脚本 Django 需要什么脚本 manage py
  • Python 的贝叶斯垃圾邮件过滤库

    我正在寻找一个可以进行贝叶斯垃圾邮件过滤的 Python 库 我查看了 SpamBayes 和 OpenBayes 但两者似乎都没有维护 我可能是错的 谁能推荐一个好的 Python 或 Clojure Common Lisp 甚至 Rub
  • 到底什么是序列?

    蟒蛇docs https docs python org 3 glossary html term sequence有点模棱两可 sequence 一个可迭代对象 支持通过以下方式使用整数索引进行有效的元素访问 getitem 特殊方法并定
  • Panda如何将行分组到不同的时间桶中?

    我有一个带有名为时间戳的日期时间类型列的数据帧 我想根据时间部分的时间戳将数据帧拆分为多个数据帧 每个数据帧包含按其值模 x 分钟进行值的行 其中 x 是变量 请注意e and f不按原来的顺序 以 10 分钟为模 我希望所有时间都以3在一
  • 访问具有动态名称的变量的值

    我发现了几个主题 其中讨论了在循环中动态创建单个变量是不好的做法 最好使用字典 就我而言 我不需要动态创建它们 我想要access他们在循环中 我不想用字典对于他们来说 因为这些变量在代码中的很多地方使用 并且只有一个地方我需要这种动态访问
  • 如何获取 Flask 中当前的基本 URI? [复制]

    这个问题在这里已经有答案了 在下面的代码中 我想将 URL 存储在变量中以检查发生 URL 错误的错误 app route flights methods GET def get flight flight data mongo db fl
  • HTML 和 BeautifulSoup:当结构事先不知道时如何迭代解析?

    我从一个简单的 HTML 结构开始 如下所示 感谢 alecxe 的帮助 我能够创建这个 JSON 字典 u Outer List u Inner List u info 1 u info 2 u info 3 使用他的代码 from bs
  • 保持 WebSocket 连接处于活动状态

    我正在研究 WebSocket 协议 并尝试在后端使用 Python 实现一个简单的 ECHO 服务 它似乎工作正常 但连接建立后立即断开 这是我的客户
  • 从 DST 感知日期时间对象在 Dataframe 中创建 pandas DatetimeIndex

    我从在线 API 收集了一系列数据点 每个数据点都有一个值和一个 ISO 时间戳 不幸的是我需要循环它们 所以我将它们存储在临时的dict然后从中创建一个 pandas 数据帧并将索引设置为时间戳列 简化示例 from datetime i
  • 将2个暗淡数组“列表列表”输出到python中的文本文件

    简单的问题 我正在创建一个两个暗淡的数组 ddist 0 d for in 0 d 在下面的代码中使用列表 它使用 gis 数据输出距离 我只是想要一种简单的方法来获取数组 列表的结果并将其输出到保持相同的 N N 结构的文本文件 我过去曾
  • 从 Keras 检查点加载

    我正在 Keras 中训练一个模型 我使用以下代码保存了所有内容 filepath project model hdh5 checkpoint ModelCheckpoint project model hdf5 monitor loss
  • 异常:AttributeError:使用 Azure Function 和 Python 的“DefaultAzureCredential”对象没有属性“signed_session”

    我编写了一个运行 Python3 的 Azure 函数来简单地打开 Azure VM 该函数应用程序具有系统分配的托管标识 我已为其授予 VM 贡献者角色 为了让该函数使用托管标识 我使用了 DefaultAzureCredential 类
  • 在 Django 1.7 中使用 html 发送电子邮件

    In 发送邮件 我们有一个新参数 html message Docs https docs djangoproject com en dev topics email send mail I have 电子邮件 html文件 我想发送我的消
  • AttributeError:“列表”对象没有属性“文本”,在 DOM 中查找元素时出错

    我尝试在树 DOM 中查找元素 但遇到问题 我写 age browser find elements by xpath div id ads ul li 6 span 2 text 但它一直显示我的错误 属性错误 列表 对象没有属性 文本
  • 需要FTP文件而不存储解释器文件通过Python保存在本地

    我正在尝试做一些图像解释器并尝试将它们直接存储到 FTP 服务器 但我的步骤是从本地文件夹上传图像 然后将其转换为蒙版图像 然后它将获得最终输出 但是在我的蒙版和最终输出场景中 临时图像被保存在本地 这是我不想要的 但如果不将图像存储在本地
  • Bokeh 中的相关图问题

    当我通过绘制数据时rect 来自 Bokeh 我在可视化中得到了一条由水平块组成的单行 数据打印正确 据我所知格式正确 type 验证它们都是列表 谁能诊断这个吗 如果问题不在这里 那么我可以附加更多代码 如果需要 在 Ubuntu 14
  • python函数中的Return语句不返回任何内容[重复]

    这个问题在这里已经有答案了 我不明白退货和打印之间的区别 有人告诉我应该在函数语句中使用 return 但它不会返回任何内容 所以我一直在函数中使用 print 但我想了解为什么我的函数中的 return 语句不起作用 def triang

随机推荐