Я бы хотел определить вспомогательную функцию, которая может изменять переменную уровня модуля (с известным именем) из окружающего контекста, не передавая ее явно, например,
# mod1.py
mod_var = 1
modify_var()
# mod_var modified
print mod_var
Проблема в том, что я не могу ссылаться на переменную mod1.mod_var
, потому что я хочу использовать вспомогательную функцию во многих модулях (сам помощник будет определен в другом модуле); он должен динамически «выбирать» mod_var из окружающего вызывающего контекста / области видимости.
Возможно ли это? Как это получить?
Мой вариант использования - улучшить определение URL -> отображение представления в Django. Эти определения распределены по многим подмодулям, которые определяют urlpatterns
переменную уровня модуля. Вспомогательная функция должна выбрать эту переменную из вызывающего ее модуля и изменить ее. Было бы здорово избежать явной передачи его в качестве аргумента.
Изменить:
Для дополнительного решения - отметьте этот ответ.
Edit2:
Неправильное решение ниже! (оставлено для ссылок в комментариях)
Недавно я нашел другое решение (наименее волшебное на мой взгляд;))
modify_var()
функция может быть реализована так:
def modify_var():
calling_module = __import__("__main__")
calling_module.mod_var = 42
Тем не менее, потенциальная прибыль спорна.
Модуль
unittest
использует эту технику в своем методе main
.