使用断言的最佳实践?

新手上路,请多包涵
  1. 使用 assert 作为标准代码的一部分而不是仅用于调试目的是否存在性能或代码维护问题?

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

好于或差于

   if x < 0:
       raise Exception('x is less than zero')

  1. 此外,是否有任何方法可以设置业务规则,如 if x < 0 raise error 始终在没有 try/except/finally 所以,如果在整个代码中的任何时候 x 0 引发错误,例如,如果您在函数开始时设置 assert x < 0 ,在函数内的任何地方 x 变得小于 0 引发异常?

原文由 meade 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 262
2 个回答

当 x 在整个函数中小于零时能够自动抛出错误。您可以使用 类描述符。这是一个例子:

 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

原文由 Nadia Alramli 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

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


例如,如果您正在编写一个函数以从配置文件读取到 dict ,文件中的不正确格式应该引发 ConfigurationSyntaxError ,而您可以 assert 你不会返回 None


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

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

原文由 Deestan 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题