Рубрики
Без рубрики

Замена функционных вызовов в Python

Я недавно столкнулся с удобной функцией в Python, которую я хотел бы поделиться с вами. Рассмотрим F … помеченные Python.

Автор оригинала: 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”