Предотвратить изменение глобальных переменных вызываемых подмодулей без изменения самого подмодуля?
Я пытаюсь написать какую-то оболочку для тестирования модуля Python. Эта оболочка имитирует среду, а затем запускает другой модуль Python через execfile. Есть много модулей Python для тестирования (>200).
Внутри этих модулей есть некоторые жестко запрограммированные переменные, которые содержат некоторые абсолютные пути к файлам, которых нет в моей моделируемой среде (я также не могу их создать). Эти пути к файлам являются путями к файлам опций, которые будет читать сценарий. Всегда существует ровно один файл опций для каждого модуля, и путь к файлам этой опции всегда сохраняется в одной и той же глобальной переменной (что я имею в виду: Имя переменной одинаково в каждом модуле: optionFile).
optionFile = "Path to Option file"
Я думал, что, возможно, я мог бы предварительно установить эту глобальную переменную "optionFile" с существующим путем, прежде чем я выполню тест-модуль. Но, конечно, это само по себе не поможет, поскольку исполняемый модуль будет просто перезаписывать "optionFile" жестко запрограммированным значением при его выполнении.
Я задавался вопросом, может ли быть способ перезаписать __setattr__
функция объекта globals, так что он не будет делать ничего для определенных имен переменных, но у меня не получилось с моими попытками. Как вы думаете, это может сработать и есть какие-либо предложения?
1 ответ
Судя по первым впечатлениям, которые мы здесь получили, изменить __setattr__
объекта globals (хотя я не понимаю, почему нет...)
Таким образом, ответ, кажется, "Нет".
РЕДАКТИРОВАТЬ:
Причина, по которой это не работает, заключается в том, что здесь нет глобальных глобальных объектов. Вместо этого каждый модуль имеет свое "личное" пространство имен со своими глобальными переменными. Это пространство имен создается после загрузки модуля. Это наверняка возможно изменить это глобальное пространство имен - но только после того, как модуль уже был загружен (что не помогает в моем сценарии приложения). Спасибо BrenBarn за разъяснения.
Конец редактирования
Обходной путь для моей описанной проблемы - изменить встроенную в Python функцию open.
# Keep original pointer to the actual Open-function
realOpen = open
# Overwrite the name of the Open-function to implement own logic
def open(filename, mode='r'):
if filename.endswith(".opt"):
print "Rerouting opening command"
realOpen("myCentralOptionFile.opt","r")
else:
realOpen(filename,mode)
Внимание: этот обходной путь больше не имеет ничего общего с названием.