How Can I Decorate All Functions Imported From A File?
I have created many functions that are divided into different files, now I would like to apply the same decorator for all of them without modifying the files and without applying t
Solution 1:
A little bit of introspection (dir()
) and dynamic look-up with getattr()
and setattr()
.
First we iterate over all names found in module and check for objects that look like functions. After that we simply reassign old function with decorated one.
main.py:
import types
import functools
defdecorate_all_in_module(module, decorator):
for name indir(module):
obj = getattr(module, name)
ifisinstance(obj, types.FunctionType):
setattr(module, name, decorator(obj))
defmy_decorator(f):
@functools.wraps(f)defwrapper(*args, **kwargs):
print(f)
return f(*args, **kwargs)
return wrapper
import mymod1
decorate_all_in_module(mymod1, decorator)
mymod1.py:
deff(x):
print(x)
defg(x, y):
print(x + y)
Output:
<function f at 0x101e309d8>
2
<function g at 0x101e30a60>
7
Process does not goes that smooth if you use star imports (from mymod import *
). Reason is simple - because all names are in one huge bag and there no differentiation on where they come from, you need a lot of additional tricks to find what exactly you want to patch. But, well, that's why we use namespaces - because they are one honking great idea.
Post a Comment for "How Can I Decorate All Functions Imported From A File?"