Я пытаюсь динамически импортировать модуль Python во время выполнения, но я хочу, чтобы импортирующий код предоставил отсутствующую переменную для импортируемого модуля.
- Python3
builtins
модуль может достичь желаемого поведения, но я не знаю, является ли это наилучшей практикой или лучшим способом сделать это.
Во-вторых, я хотел бы импортировать файл для импортасообщить импортирующему коду, какие переменные необходимо указать. У меня есть 2 возможных решения:
- Я могу просто запустить
exec_module
, перехватить ошибки имени, проанализировать отсутствующую переменную, добавить ее во встроенные функции и повторно запускать exec_module до тех пор, пока она не будет выполнена успешно. - В противном случае я думал о том, чтобы предоставить некоторую аннотацию в
file_to_import.py
, например # VARIABLES var1 var2 var3
, затем прочитать первую строку из файла (и проанализировать эту аннотацию) перед exec_module
.
По существу, чтоУ меня есть:
file_to_import.py:
# Potentially: VARIABLES my_inserted_variable
print(my_inserted_variable)
file_that_does_the_import.py
# `values` is some dictionary of values I could provide
complete, stored_attributes = False, set()
while not complete:
try:
spec.loader.exec_module(foo)
complete = True
except NameError as e:
name = str(e).split("'")[1]
if name not in values:
raise e
setattr(builtins, name, values.get(name))
stored_attributes.add(name)
for k in stored_attributes:
delattr(builtins, k)
Просто интересно, еслиbuiltins
- лучший способ выполнить передачу данных из импортируемого кода в импортированный модуль.