2015-04-15 3 views
2

Я хотел бы прослушать некоторые обращения к сторонним библиотечным методам. Примечательно, что я хотел бы приложить какой-то метод обратной связи для этих методов, которые я слушаю. Например, всякий раз, когда вызывается logging.info (msg, * args, ** kwargs), я хотел бы иметь отдельный метод с тем же списком параметров, который был запущен.python: ввод среднего человека в вызовы методов

Ближайшее, что я могу найти, это функция side_effect . Но исправьте меня, если я ошибаюсь, эта функция полностью переопределит исходное поведение функции вместо того, чтобы пометить функцию.

Есть ли модуль, который может удовлетворить мои потребности, или я должен бесцеремонно захватить функции, которые мне нужны?

Редактировать: Уточненный товар.

+1

Я не знаю ни одного питона пакета делает такую ​​вещь, но вы может быть в состоянии бросить свои собственные, используя monkeypatching и пару декораторы ... –

+0

Я бы посоветовал обернуть его, если это вообще возможно. Mock сможет выполнять работу так или иначе, но будет сложно понять и получить чистую реализацию – user3012759

ответ

0

Может быть «unceremonously», но я думаю, что это то, что вы хотите ...

def hook(*args, **kwargs): 
    # do stuff with args and kwargs 
    hook.original(*args, **kwargs) 
hook.original = logging.info 
logging.info = hook 

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

3

Угон не слишком сложно, используя методы декоратор стиль:

def hijack(obj, func_name): 
    orig_func = getattr(obj, func_name) 
    def wrapped_func(*args, **kwargs): 
     print(orig_func, args, **kwargs) 
     return orig_func(*args, **kwargs) 
    setattr(obj, func_name, wrapped_func) 

С этим, вы можете исправить класс, как (это будет работать для модулей и т.д., а):

class A: 
    def f(self): 
     pass 

Вы можете угнать A.f метод, как:

hijack(A, "f") 

Итоговое в этом:

a = A() 
a.f() 

Производство:

<function A.f at 0x7fc56b034620> (<__main__.A object at 0x7fc56b01df28>,) 

Для logging:

import logging 
hijack(logging, "warning") 

logging.warning("hi") 

Производит:

<function warning at 0x7f83355c8a60> ('hi',) 
WARNING:root:hi