2015-02-28 4 views
0

Я добавляю атрибуты модуля во время выполнения, используя следующие внутри цикла:Добавление атрибутов в модуль Python во время выполнения, чтобы быть импортированы позже

this_module = sys.modules[__name__] 
setattr(this_module, attr_name, attr_value) 

Когда я звоню print dir(this_module) из модуля, он показывает атрибуты , Большой!

Когда я импортирую модуль и пытаюсь использовать атрибут в декораторе, возникает исключение AttributeError. Для отладки я вызвал dir() на импортированном модуле, и ни один из атрибутов, добавленных на лету, не указан!

Я даже добавил имена атрибутов к __all__ для import * и все еще ничего!

Любые идеи были бы замечательными. Также, пожалуйста, дайте мне знать о любой терминологии, которую я мог бы пропустить. Я не смог найти ответ в Google.

-

Пер предложение Кевина, я добавил словарь фляги приложению (вместо его предложения топ-уровня, просто для удобства тестирования) и добавил эти атрибуты к ним:

app.security = dict() 

В цикле:

app.security[attr_name] = attr_value 

В модуле, где используется декоратор («time_entry» является имя атрибута, и он держит экземпляр класса):

@app.security['time_entry'].need() 

Когда я пытаюсь запустить сервер, теперь я получаю эту ошибку:

@security["time_write"].require() 
      ^
    SyntaxError: invalid syntax 
+1

Почему вы делаете это вместо того, чтобы просто использовать словарь верхнего уровня? – Kevin

+0

Вы уверены, что декоратор называется _after_, атрибут был установлен? Также вы можете попробовать выполнить глобальное attr_name', за которым следует 'attr_name = attr_value'. –

+0

@Kevin: Нельзя использовать словарь в качестве декоратора, правда? Я должен быть в состоянии назвать это в декораторе. –

ответ

0

Я создал обходного пути для моей конкретной проблемы. Это не решение, и я все еще планирую расследовать его дальше, как только этот проект будет завершен.

Я создал класс фиктивного типа, а затем установил атрибут с его экземпляром в моем приложении Flask.

class Security: pass 
app.security = Security() 

Затем я установить атрибуты непосредственно к классу безопасности:

setattr(app.security, attr_name, attr_value) 

Опять же, это не решает, почему те, модуль уровня атрибутов я создавал во время выполнения были не импортируются. Я вернусь и отредактирую это, как только у меня появится ответ на этот вопрос.