zoukankan      html  css  js  c++  java
  • python assert 在正式产品里禁用的手法 直接-O即可

    How do I disable assertions in Python?

    There are multiple approaches that affect a single process, the environment, or a single line of code.

    I demonstrate each.

    For the whole process

    Using the -O flag (capital O) disables all assert statements in a process.

    For example:

    $ python -Oc "assert False"
    
    $ python -c "assert False"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    AssertionError
    

    Note that by disable I mean it also does not execute the expression that follows it:

    $ python -Oc "assert 1/0"
    
    $ python -c "assert 1/0"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    ZeroDivisionError: integer division or modulo by zero
    

    For the environment

    You can use an environment variable to set this flag as well.

    This will affect every process that uses or inherits the environment.

    E.g., in Windows, setting and then clearing the environment variable:

    C:>python -c "assert False"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    AssertionError
    C:>SET PYTHONOPTIMIZE=TRUE
    
    C:>python -c "assert False"
    
    C:>SET PYTHONOPTIMIZE=
    
    C:>python -c "assert False"
    Traceback (most recent call last):
      File "<string>", line 1, in <module>
    AssertionError
    

    Same in Unix (using set and unset for respective functionality)

    Single point in code

    You continue your question:

    if an assertion fails, I don't want it to throw an AssertionError, but to keep going.

    If you want the code that fails to be exercised, you can catch an assertion error:

    try:
        assert False, "we know this fails"
    except AssertionError as e:
        print(repr(e))
    

    which prints:

    AssertionError('we know this fails',)
    

    and you'll keep going from the point you handled the AssertionError.

    References

    From the assert documentation:

    An assert statement like this:

    assert expression #, optional_message
    

    Is equivalent to

    if __debug__:
        if not expression: raise AssertionError #(optional_message)
    

    And,

    the built-in variable __debug__ is True under normal circumstances, False when optimization is requested (command line option -O).

    From the usage docs:

    -O

    Turn on basic optimizations. This changes the filename extension for compiled (bytecode) files from .pyc to .pyo. See also PYTHONOPTIMIZE.

    and

    PYTHONOPTIMIZE

    If this is set to a non-empty string it is equivalent to specifying the -O option. If set to an integer, it is equivalent to specifying -O multiple times.

  • 相关阅读:
    解决win7和win8的64位系统安装NetAdvantage时总是提示%SystemDriver%inetpub\wwwroot错误的方法
    如何使VS2008 调试网站的根目录和IIS调试的一致?
    设置网站默认目录
    asp.net网站未能加载文件或程序集或它的某一个依赖项。拒绝访问
    HTML5 :Canvas之基本用法
    HTML5 Canvas之图片引用
    python虚拟环境的介绍和创建
    基于jTemplates、ascx协同工作的酷UI模板技术
    我的.Subtext二次开发之路系列:无限层次分类
    我的.Subtext二次开发之路系列:引言
  • 原文地址:https://www.cnblogs.com/bonelee/p/11413905.html
Copyright © 2011-2022 走看看