シミュレーション モデルの個別のコンポーネントを表すいくつかのモジュールで構成される python パッケージでいくつかの関数を定義しています。
シミュレーション モデルを実行するには、パッケージをインポートし、次のよう__name__
にモジュールを反復処理することで関数を抽出します。__dict__
import model # The package containing python modules
import inspect
import types
# Get the modules defined in the package
modules = [v for v in vars(model).values() if isinstance(v, types.ModuleType)]
funcs = {}
# Iterate through modules in python package
for module in modules:
# Go through objects in module `__dict__`
for name, obj in vars(module).items(): # decorated functions no longer appear here
# Check for functions
if isinstance(obj, types.FunctionType):
# Make sure that the function is defined within the model package
mod, *sub_mod = inspect.getmodule(obj).__name__.split('.')
if mod == model.__name__:
# Store the function along with its name
funcs[name] = obj
ただし、このコードをデバッグしているときに、あるはずの関数が含まれvars(module).items()
ていないことに気付きました。これは、一部の関数にデコレータを適用した後に発生しましたlru_cache
が、これらの関数は正確には表示されていません。
Python パッケージのいくつかの関数にデコレータを適用した後、__dict__
それらが定義されているモジュールに表示されないのはなぜですか?
デコレータを適用して関数を に表示させる方法はありvars(module).items()
ますか?