Оберните каждую функцию или метод класса в модуль Python по умолчанию, не украшая каждый

У меня есть код, из которого я хочу получать электронное письмо всякий раз, когда он сталкивается с таким исключением.

try:
    f(**kwargs)
except Exception as e:
    # email me the environment

Я знаю, что для этого могут работать декораторы Python, например:

@check_error
def f()
@check_error
def g()

Что, если я хочу, чтобы каждый код в моем модуле был упакован по умолчанию? Как def f() без @check_error, но я все еще хочу добиться этого. В идеале решение должно применяться как для функций, так и для методов класса.


person zhihuifan    schedule 17.01.2016    source источник


Ответы (1)


Вы можете самостоятельно исследовать модули, поэтому, предположив, что module — это модуль, для которого вы хотите декорировать все функции, вы можете сделать что-то вроде этого:

import inspect
for name, f in inspect.getmembers(module, inspect.isfunction):
    setattr(module, name, check_error(f))

Вы даже можете сделать это в текущем модуле, используя sys.modules[__name__] для module

person Thayne    schedule 17.01.2016