Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么AssertRaises持久化对超出测试函数范围的对象的引用?_Python_Python 3.x - Fatal编程技术网

Python 为什么AssertRaises持久化对超出测试函数范围的对象的引用?

Python 为什么AssertRaises持久化对超出测试函数范围的对象的引用?,python,python-3.x,Python,Python 3.x,我有一些代码检查属性,以确保它可以转换为整数。它通过添加try/except块,然后引发信息更丰富的异常来实现这一点。但是,当我使用AssertRaises检查测试中的异常时,不会调用该对象的析构函数!我无法理解对对象的引用如何在测试函数的范围之外继续存在。有没有人知道幕后发生了什么事情 以下是我的代码,仅限于失败: class Dummy: def __init__(self): print("initing") def __del__(self):

我有一些代码检查属性,以确保它可以转换为整数。它通过添加try/except块,然后引发信息更丰富的异常来实现这一点。但是,当我使用AssertRaises检查测试中的异常时,不会调用该对象的析构函数!我无法理解对对象的引用如何在测试函数的范围之外继续存在。有没有人知道幕后发生了什么事情

以下是我的代码,仅限于失败:

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用作上下文时也会发生这种情况