Как я могу вызвать unittest.assertRaisesRegex из кода, который поддерживает Python 2 и Python 3? - PullRequest
0 голосов
/ 13 апреля 2020

В 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')

Как правильно добавить атрибут в существующий unittest, который отображается на assertRaisesRegexp для Python 2, но на assertRaisesRegex для Python 3?

1 Ответ

0 голосов
/ 13 апреля 2020

К моему удивлению, оказалось, что ничто не мешает мне звонить setattr на unittest.TestCase, хотя класс из стандартной библиотеки Python. Таким образом, я могу сделать это:

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