0

シミュレーション モデルの個別のコンポーネントを表すいくつかのモジュールで構成される 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()ますか?

4

1 に答える 1

1

問題は、関数を lru_cache でラップすると、結果は関数ではなく、呼び出し可能なオブジェクトだけになることです。正確な型はfunctools._lru_cache_wrapper.

私はもともとこれをコメントとして投稿しました。pbreach の解決策は、ネットワークが広すぎるため、 に置き換えることでしtypes.FunctionType(types.FunctionType, functools._lru_cache_wrapper)callable()

于 2017-01-04T21:41:13.983 に答える