0

Я определяю несколько функций в пакете 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()?

+2

Ну, они не отображаются, потому что lru_cache - это фабрика для экземпляров «_lru_cache_wrapper», которые являются только вызываемыми объектами. Итак, вы отфильтровываете их с помощью проверки FunctionType. – mwchase

+0

А, ладно. По какой-то причине я, хотя они появятся как функции. Я не могу использовать вызовы, поэтому вместо этого я просто делал эту проверку: 'if isinstance (obj, (types.FunctionType, functools._lru_cache_wrapper)'. Все остальное отлично работает! Не стесняйтесь публиковать ответ. – pbreach

ответ

1

Проблема в том, что когда вы завертываете функцию с помощью lru_cache, результатом является только вызываемый объект, а не функция. Точный тип: functools._lru_cache_wrapper.

Я изначально разместил это как комментарий. Решение pbreach состояло в том, чтобы заменить types.FunctionType на (types.FunctionType, functools._lru_cache_wrapper), потому что callable() был слишком широк.

 Смежные вопросы

  • Нет связанных вопросов^_^