禁用python的assert()而不使用-0标志

pbp*_*pbp 10 python debugging assert

我正在从不同的软件中运行一个python脚本(它提供了一个python接口来操纵它的数据结构).

我正在优化我的代码速度,并希望看到我的断言对性能有什么影响.

我无法使用python -O.我有什么其他选项,以编程方式禁用python代码中的所有断言?变量__debug__(由-O标志清除)不能分配给:(

unu*_*tbu 9

文档说,

__debug__解释器启动时确定内置变量[ ]的值.

因此,如果您无法控制python解释器的启动方式,那么看起来您无法禁用断言.

这里有一些其他选择:

  1. 最安全的方法是手动删除所有断言语句.
  2. 如果所有断言语句都是单独出现在行上,那么也许你可以删除它们

    sed -i 's/assert /pass #assert /g' script.py
    
    Run Code Online (Sandbox Code Playgroud)

    请注意,如果其他代码出现在断言之后,这将破坏您的代码.例如,上面的sed命令会return在这样的行中注释掉:

    assert x; return True
    
    Run Code Online (Sandbox Code Playgroud)

    这将改变你的程序的逻辑.

    如果你有这样的代码,最好手动删除断言.

  3. 可能有一种方法可以通过使用tokenize模块解析脚本来以编程方式删除它们,但编写此类程序以删除断言可能需要比手动删除断言所花费的时间更多,特别是如果这是一次性作业.

  4. 如果另一个软件接受.pyc文件,那么有一个脏技巧似乎可以在我的机器上运行,但请注意Python核心开发人员警告这一点(参见ÉricAraujo对2011-09-17的评论).假设您的脚本被调用script.py.

    • 创建一个名为temp.py的临时脚本:

      import script
      
      Run Code Online (Sandbox Code Playgroud)
    • python -O temp.py.这创造了script.pyo.
    • 移动script.pyscript.pyc(如果存在)PYTHONPATH或其他软件正在读取的目录以查找脚本.
    • 重命名script.pyo- > script.pyc.

    现在,当其他软件尝试导入您的脚本时,它只会找到pyc删除了断言的文件.

    例如,如果script.py看起来像这样:

    assert False
    print('Got here')
    
    Run Code Online (Sandbox Code Playgroud)

    然后运行python temp.py现在将打印Got here而不是引发AssertionError.