如何Debug
知道它是从哪个模块导入的?答:不能。如果它被导入到多个模块中,怎么会Debug
知道运行不止一次?答:不会;模块只运行一次然后缓存。所以你想做的事情不能像你想做的那样简单。
但是,您可以通过debug
在导入后调用模块中的函数来做到这一点。您可以__name__
从调用模块传递以提供其名称,之后可以获得对模块本身的引用,然后是其中定义的顶级变量,其中一些可能是函数。然后可以装饰这些。
# debug.py
import types, sys, functools
# decorator to be applied to all top-level functions in a module
def debug(fn):
@functools.wraps(fn)
def wrapper(*args, **kwargs):
print "calling", fn.__name__, "with args", *args, **kwargs
result = fn(*args, **kwargs)
print "returning from", fn.__name__, "with return value", result
return result
# decorate all top-level functions in named module with a given decorator
# (by default it is the above decorator but it could be a different one)
# This makes these functions behave as though they had been written with
# @debug above them.
def set_debug(modname, debug=debug):
module = sys.modules[modname]
for name in dir(module):
if not name.startswith("_"):
thing = getattr(module, name)
if isinstance(thing, types.FunctionType):
setattr(module, name, debug(thing))
现在在调用模块中:
# main.py
import debug
def main():
print "in main module"
debug.set_debug(__name__) # install debugging decorator
main()
Jim Garrison 显式传递命名空间(而不是模块名称)的方法也很好,实际上简化了一些事情;你可以用它来装饰模块以外的东西。我已经分解了我的,因此您可以根据需要传入不同的装饰器。