Debug
はどのモジュールをインポートするのですか?答え:できません。 Debug
は、複数のモジュールにインポートされた場合、どのように2回以上実行することができますか?答え:そうではありません。モジュールは一度だけ実行されてからキャッシュされます。だからあなたがしたいことは、あなたが望むだけ単純にすることはできません。
ただし、インポート後に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()
ジム・ギャリソンのアプローチも良いですし、実際に物事ビットを簡素化します。モジュール以外のものを装飾するために使用することができます。私は鉱山を壊してしまったので、あなたが望むなら別のデコレータを渡すことができます。
インポート後に 'Debug'で関数を呼び出す必要があります。 'Debug'はおそらくインポートモジュール自身がインポートされている間はインポートモジュールに反映されません。IMHO、あなたは 'debug import from debug_func'を実行し、それを必要とする関数で' @ debug_func'デコレータを使う方が良いでしょう。ファイル内の '@ debug_func'のすべてのインスタンスのコメントやコメント解除ができる正規表現を書くのは難しいことではありません。 –
私は 'decorate_all'関数を書くことができます。関数はパラメータとして関数を受け取り、' gobals() 'の' callable'エントリをすべて見て、それらを飾るか、それと似ています。インポート後にこれを呼び出します。 –