assert作为标准代码的一部分使用而不是仅仅用于调试目的,是否存在性能或代码维护问题?
是
assert x >= 0, 'x is less than zero'
Run Code Online (Sandbox Code Playgroud)
好或坏比
if x < 0:
raise Exception, 'x is less than zero'
Run Code Online (Sandbox Code Playgroud)另外,有没有办法设置业务规则if x < 0 raise error,总是在没有try/except/finally这样的情况下进行检查,如果在整个代码中的任何时候x小于0都会引发错误,就像你assert x < 0在函数的开头设置一样,在函数内的任何地方哪里x变得少于0则引发异常?
我已经阅读了"加注"的官方定义,但我仍然不太明白它的作用.
简单来说,什么是"提高"?
示例用法会有所帮助.
我知道如果我想重新引发一个异常,我raise在相应的except块中使用不带参数.但是给出了一个嵌套的表达式
try:
something()
except SomeError as e:
try:
plan_B()
except AlsoFailsError:
raise e # I'd like to raise the SomeError as if plan_B()
# didn't raise the AlsoFailsError
Run Code Online (Sandbox Code Playgroud)
如何在SomeError不破坏堆栈跟踪的情况下重新提升?raise在这种情况下,单独会重新提高最近AlsoFailsError.或者我怎么能重构我的代码以避免这个问题?
让我们假设我们有这样的结果:
import py, pytest
ERROR1 = ' --- Error : value < 5! ---'
ERROR2 = ' --- Error : value > 10! ---'
class MyError(Exception):
def __init__(self, m):
self.m = m
def __str__(self):
return self.m
def foo(i):
if i < 5:
raise MyError(ERROR1)
elif i > 10:
raise MyError(ERROR2)
return i
# ---------------------- TESTS -------------------------
def test_foo1():
with pytest.raises(MyError) as e:
foo(3)
assert ERROR1 in str(e)
def test_foo2():
with pytest.raises(MyError) as e:
foo(11)
assert ERROR2 in str(e)
def test_foo3(): …Run Code Online (Sandbox Code Playgroud) 我想在我的一个模型上测试一个抛出特定错误的函数.该函数看起来像这样:
def merge(release_to_delete)
raise "Can't merge a release with itself!" if( self.id == release_to_delete.id )
raise "Can only merge releases by the same artist" if( self.artist != release_to_delete.artist )
#actual merge code here
end
Run Code Online (Sandbox Code Playgroud)
现在我想做一个断言,当我用一个导致每个异常的参数调用这个函数时,实际上会抛出异常.我正在查看ActiveSupport文档,但我没有找到任何有希望的东西.有任何想法吗?
以下是我的代码:
test = 'abc'
if True:
raise test + 'def'
Run Code Online (Sandbox Code Playgroud)
当我运行它时,它给了我 TypeError
TypeError: exceptions must be old-style classes or derived from BaseException, not str
Run Code Online (Sandbox Code Playgroud)
那应该test是什么类型的?
我已经学习了Python一段时间和raise功能,assert并且(我意识到他们两个都崩溃了应用程序,不像尝试 - 除外)非常相似,我看不到你会使用raise或assert结束的情况try.
那么,Raise,Try和Assert有什么区别?
当我在Python库中引发自己的异常时,异常堆栈将raise-line本身显示为堆栈的最后一项.这显然不是错误,在概念上是正确的,但是当您在外部使用代码时,例如作为模块,将注意力集中在对调试无用的事情上.
有没有办法避免这种情况,并强制Python将前一个到最后一个堆栈项显示为最后一个堆栈项,就像标准的Python库一样.
遵循"武士原则",我试图在我的功能上做这个,但似乎是错的......
return <value> if <bool> else raise <exception>
Run Code Online (Sandbox Code Playgroud)
有没有其他"美丽"的方式来做到这一点?谢谢