Вы можете использовать unittest.mock.patch
в операторе with
для замены чего-либо.Я не могу сказать вам точно, как это сделать, не видя код, но если регулярное выражение уже находится в глобальном, вы можете просто заменить его на время вызова.
Если оно сделано из строкиЛитерал, записанный внутри функции, вы можете вместо этого исправить любую переданную функцию, например re.compile
или re.match
и т. д. Создайте обертку, которая проверяет одну строку, которую вы хотите заменить, замените ее и затем делегируйте реальной функции,(Сохраните ссылку на реальную вещь вне оператора with
и используйте ее, если вы не хотите переполнения стека:)
old_compile = re.compile
with patch.object(re, 'compile', lambda s: old_compile('eggs' if s == 'spam' else s)):
bad_library_function()
В этом примере предполагается, что bad_library_function
имеет вызовк re.compile
со строковым литералом «спам», который вам не нравится, и вы бы предпочли, чтобы это было eggs
.Патч заменяет его новой функцией, которая обрабатывает аргумент 'spam'
, как если бы он был 'eggs'
, и в противном случае ведет себя как исходная функция re.compile
, но только в течение оператора with
.
Такой подход к обезьянничью очень хрупок.Если вы обновите библиотеку и она изменит реализацию, ваш патч может сломаться.