Я определяю несколько функций в пакете python, состоящий из нескольких модулей, представляющих отдельные компоненты имитационной модели.Применение декоратора к функции, как представляется, удаляет его из модуля __dict__
Для выполнения имитационной модели, пакет импортирован и функция вместе с их __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
Однако, когда я отладку этого кода я m замечая, что некоторые функции, которые должны быть в vars(module).items()
, не являются. Это произошло после нанесения декоратора lru_cache
на некоторые из функций, которые точно не отображаются.
Почему после применения декоратора к некоторым функциям пакета python они не отображаются в модуле __dict__
, для которого они определены?
Есть ли способ по-прежнему использовать декоратор и функции отображаются в vars(module).items()
?
Ну, они не отображаются, потому что lru_cache - это фабрика для экземпляров «_lru_cache_wrapper», которые являются только вызываемыми объектами. Итак, вы отфильтровываете их с помощью проверки FunctionType. – mwchase
А, ладно. По какой-то причине я, хотя они появятся как функции. Я не могу использовать вызовы, поэтому вместо этого я просто делал эту проверку: 'if isinstance (obj, (types.FunctionType, functools._lru_cache_wrapper)'. Все остальное отлично работает! Не стесняйтесь публиковать ответ. – pbreach