Python ass的最佳实践

2024-04-26 03:33:22 发布

您现在位置:Python中文网/ 问答频道 /正文

  1. 使用assert作为标准代码的一部分而不是仅用于调试,是否存在性能或代码维护问题?

    assert x >= 0, 'x is less than zero'
    

    好或坏于

    if x < 0:
        raise Exception, 'x is less than zero'
    
  2. 此外,是否有任何方法可以设置像if x < 0 raise error这样的业务规则,该规则总是在没有try/except/finally的情况下检查的,因此,如果在整个代码中x小于0的任何时间,都会引发错误,就像在函数开始时设置assert x < 0,在函数中x小于0的任何地方,都会引发异常?


Tags: 方法函数代码标准ifis规则exception
3条回答

断言应用于测试不应该发生的条件。目的是在程序状态损坏的情况下尽早崩溃。

异常应该用于可能发生的错误,并且几乎总是应该创建自己的异常类。


例如,如果要将函数从配置文件中读取到dict,则文件中的不正确格式将引发ConfigurationSyntaxError,而您可以assert返回None


在您的示例中,如果x是通过用户界面或外部源设置的值,则异常是最好的。

如果x只由您自己的代码在同一程序中设置,请使用断言。

当x在整个函数中小于零时,能够自动抛出错误。您可以使用class descriptors。下面是一个例子:

class LessThanZeroException(Exception):
    pass

class variable(object):
    def __init__(self, value=0):
        self.__x = value

    def __set__(self, obj, value):
        if value < 0:
            raise LessThanZeroException('x is less than zero')

        self.__x  = value

    def __get__(self, obj, objType):
        return self.__x

class MyClass(object):
    x = variable()

>>> m = MyClass()
>>> m.x = 10
>>> m.x -= 20
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "my.py", line 7, in __set__
    raise LessThanZeroException('x is less than zero')
LessThanZeroException: x is less than zero

优化编译时将删除“assert”语句。所以,是的,在性能和功能上都有差异。

The current code generator emits no code for an assert statement when optimization is requested at compile time. - Python 2.6.4 Docs

如果使用assert来实现应用程序功能,然后优化部署到生产环境,那么您将受到“但它在开发环境中工作”缺陷的困扰。

PYTHONOPTIMIZE-O -OO

相关问题 更多 >