Как исправить одну строку в функции во время выполнения Python - PullRequest
0 голосов
/ 28 декабря 2018

Я использую стороннюю библиотеку для разбора какого-то конкретного домена.Хорошая вещь в том, что библиотека работает, плохая вещь в том, что у библиотеки есть некоторые небольшие проблемы, которые я хотел бы изменить, уродливая вещь - это то, что функция, которую я использую, имеет около 2000 строк.Я просто хочу изменить одно регулярное выражение внутри выражения if, есть ли способ, которым я мог бы "исправить" это без изменения исходной библиотеки?

1 Ответ

0 голосов
/ 28 декабря 2018

Вы можете использовать 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.


Такой подход к обезьянничью очень хрупок.Если вы обновите библиотеку и она изменит реализацию, ваш патч может сломаться.

...