Автор оригинала: Florian Rohrer.
Я недавно столкнулся с удобной функцией в Python, которую я хотел бы поделиться с вами. Рассмотрим следующий кусок кода:
# This code is not modifiable # a.py from scipy.spatial.distance import cdist def test_function(): coords = [(0,0), (3,4)] y = cdist(coords, coords, metric="euclidean") print(y)
Эта функция использует внешний Дистанционная функция называется CDist ()
и рассчитывает евклидовые расстояния некоторых (заканчиваемых) списка точек. Результирующая матрица расстояний между каждой парой точек напечатана на консоль. До сих пор вы использовали эту функцию в вашем коде, и все было хорошо.
# Your code = modifiable from a import test_function test_function() # Prints # [[ 0. 5.] # [ 5. 0.]]
Тем не менее, вы решаете, что теперь вы не хотите использовать евклидое расстояние больше. Вы хотите использовать некоторую другую функцию вместо CDist ()
Отказ Есть проблема: вы не можете изменить вышеуказанный код. Ваш коллега писал этот выше код, и он не в городе. Но вам все еще нужно использовать эту функцию. Полное переписание также невозможно, потому что вы думаете, что функция слишком сложная.
Решение: mock.patch ()
# Your new code from a import test_function from unittest import mock def rogue_cdist(x1, x2, metric): print("rogue_cdist called") with mock.patch('a.cdist', wraps=rogue_cdist): test_function() # Prints # rougue_cdist called # None
mock.patch () Работает, временно изменяя объект, на который указывает имя с другим. Вы можете использовать mock.patch ()
с менеджером контекста, как показано выше. В приведенном выше примере ваш новый rogue_cdist ()
Функция вызывается, и теперь вы можете заполнить его любым любым метрическим расстоянием.
Я думаю, что это очень умно и чистый и позволяет вам делать изменения в существующем коде, без необходимости внасоленного стиля кодирования копирования-патежино.
Оригинал: “https://dev.to/r0f1/replacing-function-calls-in-python-eep”