Python 为什么AssertRaises持久化对超出测试函数范围的对象的引用?
我有一些代码检查属性,以确保它可以转换为整数。它通过添加try/except块,然后引发信息更丰富的异常来实现这一点。但是,当我使用AssertRaises检查测试中的异常时,不会调用该对象的析构函数!我无法理解对对象的引用如何在测试函数的范围之外继续存在。有没有人知道幕后发生了什么事情 以下是我的代码,仅限于失败:Python 为什么AssertRaises持久化对超出测试函数范围的对象的引用?,python,python-3.x,Python,Python 3.x,我有一些代码检查属性,以确保它可以转换为整数。它通过添加try/except块,然后引发信息更丰富的异常来实现这一点。但是,当我使用AssertRaises检查测试中的异常时,不会调用该对象的析构函数!我无法理解对对象的引用如何在测试函数的范围之外继续存在。有没有人知道幕后发生了什么事情 以下是我的代码,仅限于失败: class Dummy: def __init__(self): print("initing") def __del__(self):
class Dummy:
def __init__(self):
print("initing")
def __del__(self):
print("deleting")
def f(self, val):
try:
int(val)
except:
raise Exception("what?")
class MyTest(unittest.TestCase):
def test_dummy(self):
print("Starting test")
d = Dummy()
self.assertRaisesRegex(Exception,
"what?",
d.f,
'one',
)
print("Ending test")
以下是测试输出:
Starting test
initing
Ending test
----------------------------------------------------------------------
Ran 1 tests in 0.001s
请注意,它不打印“删除”
只有在函数的异常块中引发异常时,才会发生这种情况。如果使用If/else并引发异常,则不会发生这种情况
使用常规的旧AssertRaises时也会发生这种情况,将AssertRaises用作上下文时也会发生这种情况