首页 > 解决方案 > 如何从支持 Python 2 和 Python 3 的代码中调用 unittest.assertRaisesRegex?

问题描述

在 Python 3.2 中,unittest.assertRaisesRegexp被重命名为unittest.assertRaisesRegex. 如何从必须同时支持 Python 2 和 3 的代码中调用此功能,同时保留现有语法?我宁愿避免将调用更改self.assertRaisesRegexp('ValueError', 'foo')为调用myAssertRaisesRegex(self, 'ValueError', 'foo'). 我最喜欢的方法是让我继续使用 Python 3 名称,因为我们最终将放弃对 Python 2 的支持。作为第二好的,我可以使用类似self.assertRaisesRegexSpecial('ValueError', 'foo')的语法——换句话说,想出一个我自己的名字,它可以在 Python 2 和 3 上工作,而不需要改变语法。

该函数是一个类方法,所以我不能遵循通常为range/所做的模式xrange

try:
    xrange
except NameError:
    range = xrange

# Now range can be used from this point on in the code.

据我所知,我也不能修改课程。我知道如何确定unittest.assertRaisesRegex我正在使用的 Python 版本中是否存在,即:

hasattr(unittest.TestCase, 'assertRaisesRegexp')

将属性添加到映射到assertRaisesRegexpPython 2 但映射到assertRaisesRegexPython 3 的现有单元测试的正确方法是什么?

标签: pythonpython-3.xpython-2.7

解决方案


令我惊讶的是,即使该类来自标准 Python 库,也没有什么能阻止我调用setattrunittest.TestCase。因此,我可以这样做:

if not hasattr(unittest.TestCase, 'assertRaisesRegex'):
    setattr(unittest.TestCase, 'assertRaisesRegex', unittest.TestCase.assertRaisesRegexp)

推荐阅读