Wie würde Debug
wissen, aus welchem Modul es importiert wird? Antwort: Es kann nicht. Wie kann Debug
mehr als einmal ausgeführt werden, wenn es in mehr als ein Modul importiert wird? Antwort: Es würde nicht; Module werden nur einmal ausgeführt und dann zwischengespeichert. Was Sie also tun möchten, kann nicht ganz so einfach gemacht werden, wie Sie möchten.
Sie könnten dies jedoch tun, indem Sie nach dem Importieren eine Funktion in Ihrem debug
Modul aufrufen. Sie können __name__
vom aufrufenden Modul übergeben, um seinen Namen anzugeben, nach dem es möglich ist, einen Verweis auf das Modul selbst und dann die darin definierten Variablen der obersten Ebene zu erhalten, von denen einige Funktionen sein können. Diese können dann dekoriert werden.
# 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))
nun in dem rufenden Modul:
# main.py
import debug
def main():
print "in main module"
debug.set_debug(__name__) # install debugging decorator
main()
Jim Garrison Ansatz den Namespace explizit der Weitergabe (statt dem Modulnamen) ist auch gut und tatsächlich vereinfacht die Dinge ein wenig; Sie könnten damit andere Dinge als Module dekorieren. Ich habe meine kaputt gemacht, so dass du einen anderen Dekorateur einreichen kannst, wenn du willst.
Sie müßten nach dem Import eine Funktion in 'Debug' aufrufen; 'Debug 'kann wahrscheinlich nicht über das importierende Modul reflektieren, während es selbst importiert wird.IMHO, du bist besser dran '' von Debug importieren debug_func' und dann mit dem '@ debug_func' Dekorator auf die Funktionen, die es brauchen. Es wäre nicht zu schwer, eine Regexp zu schreiben, die alle Instanzen von '@ debug_func' in einer Datei kommentieren oder auskommentieren könnte. –
Ich denke, du könntest eine 'decorate_all' Funktion schreiben, die eine Funktion als Parameter nimmt, alle' callable' Einträge in 'gobals()' betrachtet und sie oder etwas ähnliches verziert. Rufen Sie dies nach dem Import auf. –