Я хотел бы динамически создавать модуль из словаря, и мне интересно, действительно ли добавление элемента в sys.modules
- лучший способ сделать это. EG
context = { a: 1, b: 2 }
import types
test_context_module = types.ModuleType('TestContext', 'Module created to provide a context for tests')
test_context_module.__dict__.update(context)
import sys
sys.modules['TestContext'] = test_context_module
Моя ближайшая цель в этом отношении заключается в том, чтобы предоставить контекст для выполнения теста времени:
import timeit
timeit.Timer('a + b', 'from TestContext import *')
Кажется, что есть другие способы сделать это, поскольку конструктор Timer принимает объекты, а также строки. Мне все еще интересно узнать, как это сделать, поскольку а) у него есть другие потенциальные приложения; и б) я не уверен точно, как использовать объекты с конструктором Timer; в некоторых случаях это может оказаться менее подходящим, чем этот подход.
редактирует /Revelations/PHOOEYS/EUREKAE:
-
Я понял, что пример кода, связанный с запуском тестов времени, на самом деле не работает, потому что
import *
работает только на уровне модуля, а контекст, в котором выполняется этот оператор, - это функция в модулеtestit
. Другими словами, словарь globals, используемый при выполнении этого кода, относится к__main__
, так как тот, где я был, когда я написал код в интерактивной оболочке. Так что логика для выяснения этого является немного неудачной, но это все еще правильный вопрос. -
Я обнаружил, что код, запущенный в первом наборе примеров, имеет нежелательный эффект, что пространство имен, в котором выполняется только что созданный код модуля, - это модуль, в котором он был объявлен, не собственный модуль. Это похоже на то, как странно, и может привести к разным неожиданностям гремучей змеи. Поэтому я уверен, что это не, как это должно быть сделано, если это на самом деле то, что Гвидо блистает.
-
Подобный-но-тонкий случай динамической загрузки модуля из файла, который не находится в python, включает путь, который легко выполняется с помощью
imp.load_source('NewModuleName', 'path/to/module/module_to_load.py')
. Это загружает модуль вsys.modules
. Однако это не отвечает на мой вопрос, потому что, действительно, что, если вы используете python на встроенной платформе без файловой системы?
В настоящий момент я сражаюсь со значительным случаем информационной перегрузки, поэтому я ошибаюсь, но в модуле imp
, который способен на это, похоже, ничего нет.
Но вопрос, по сути, на этом этапе заключается в том, как установить глобальный (то есть модуль) контекст для объекта. Может быть, я должен спросить об этом более конкретно? И в большей степени, как заставить Python делать это, пока объекты shoehorning в данный модуль?