python - 如何从支持 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')
将属性添加到映射到assertRaisesRegexp
Python 2 但映射到assertRaisesRegex
Python 3 的现有单元测试的正确方法是什么?
解决方案
令我惊讶的是,即使该类来自标准 Python 库,也没有什么能阻止我调用setattr
它unittest.TestCase
。因此,我可以这样做:
if not hasattr(unittest.TestCase, 'assertRaisesRegex'):
setattr(unittest.TestCase, 'assertRaisesRegex', unittest.TestCase.assertRaisesRegexp)
推荐阅读
- css - 动画翻译无法正常工作
- ios - 在构建我的 Firestore 数据库时需要帮助/建议
- python - 如何从另一个类的 __init__ 访问一个类的属性?
- java - Java 多客户端聊天服务器私信选项
- r - 按 data.table 中的所有列分组
- laravel - hasOne() 带有 select 和 where 条件
- php - PHP:如何修改工作电子邮件脚本以在自己的服务器上运行(LAMP 服务器上的 PHP 邮件服务器设置)
- c - 如何找到 uint_fast32_t 的宽度
- javascript - 如何删除firestore集合数据库中的所有文档
- postgresql - 为什么来自 Postgis 的 ST_Intersection 返回多线串以用于自相交线串?