Python - патч обезьяны не получается, почему? - PullRequest
3 голосов
/ 17 апреля 2019

Я хочу установить патч на f(*args, **kwargs) из установленного модуля. Я использую идею декоратора в своем собственном коде, но другие методы из установленного модуля не могут правильно вызвать f.

Вот пример:

import numpy as np

def log(func):
    def wrapper(*args, **kwargs):
        print('logging')
        return func(*args, **kwargs)
    return wrapper

if __name__ == "__main__":
    a1 = np.asarray([0, 1, 2])
    print(f'a1={a1}')

    a2 = np.array([0, 1, 2])
    print(f'a2={a2}')

    np.array = log(np.array)

    a3 = np.asarray([0, 1, 2])
    print(f'a3={a3}')

    a4 = np.array([0, 1, 2])
    print(f'a4={a4}')

Вывод:

a1=[0 1 2]
a2=[0 1 2]
a3=[0 1 2]
logging
a4=[0 1 2]

Я бы хотел, чтобы результат был:

a1=[0 1 2]
a2=[0 1 2]
logging
a3=[0 1 2]
logging
a4=[0 1 2]

, поскольку asarray вызывает array в исходном коде.

Мои вопросы: 1. Почему патч обезьяны терпит неудачу? 2. Как это исправить?

1 Ответ

2 голосов
/ 18 апреля 2019

По np.array = log(np.array) вы меняете, к какой функции относится «публичное» имя np.array.

Но np.asarray определен в модуле numpy.core.numeric, который имеет собственное «личное» имя для ссылки на эту функцию. На это не влияет исправление публичного имени.

Вы должны будете исправить частное имя:

np.core.numeric.array = log(np.array)
...