Для отслеживания определенных вызовов вы можете обернуть каждую интересующую функцию своим собственным регистратором. Это приводит к тому, что аргументы расширяются до их значений, а не только имен аргументов в выводе.
Функции должны передаваться как строки, чтобы избежать проблем, когда модули перенаправляют на другие модули, такие как os.path / posixpath Я не думаю, что вы можете извлечь правильное имя модуля для патча только из объекта функции.
Код упаковки:
import importlib
def wrapper(ffull, f):
def logger(*args, **kwargs):
print "TRACE: %s (%s, %s)" % (ffull, args, kwargs)
return f(*args, **kwargs)
return logger
def log_execution(ffull):
parts = ffull.split('.')
mname = '.'.join(parts[:-1])
fname = parts[-1]
m = importlib.import_module(mname)
f = getattr(m, fname)
setattr(m, fname, wrapper(ffull, f))
Использование:
for f in ['os.path.join', 'os.listdir', 'sys.exit']:
log_execution(f)
p = os.path.join('/usr', 'bin')
os.listdir(p)
sys.exit(0)
....
% ./a.py
TRACE: os.path.join (('/usr', 'bin'), {})
TRACE: os.listdir (('/usr/bin',), {})
TRACE: sys.exit ((0,), {})