Есть тестовая обёртка, она внутри себя использует .assertEquals, который сравнивает два значения. Есть N тестов, которые используют эту обёртку.
def example(actual, expected):
message = 'not equal!!!111'
self.assertEquals(actual, expected, message)
example(1, 2)
Я хочу расширить функционал, чтобы стало можно проверять assertIn, но для существующих тестов поведение не поменялось. То есть:
- Кортежи, списки и словари передавать как есть
- Строки и числа оборачивать в iterable (вероятно, кортеж) из одного элемента. Да, строка - iterable, но я хочу сохранить для строк старое поведение.
- Если я захочу передать iterable как единственный элемент, я сам оберну его в кортеж
example(1, 2) # fail
example(1, [1, 2]) #pass
example(1, ([1, 2],)) # fail
example([1, 2], ([1, 2],)) # pass
example('a', 'abc') # fail
example('a', ('a', 'b', 'c')) # pass
example('a', list('abc')) # pass
Пока что я придумал вариант через hasattr:
def example(actual, expected):
message = 'not equal!!!111'
if not hasattr(expected, '__iter__'):
expected = expected,
self.assertIn(actual, expected, message)
Либо так:
def example(actual, expected):
message = 'not equal!!!111'
if hasattr(expected, '__iter__'):
self.assertIn(actual, expected, message)
else:
self.assertEqual(actual, expected, message)
Есть ли слабые места у этого решения? Как сделать лучше/короче? Какое-нибудь волшебное приведение типов вроде !! в JS?