Как вставить переменную в пространство имен динамически загружаемого модуля? - PullRequest
0 голосов
/ 24 октября 2019

Я пытаюсь динамически импортировать модуль 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 - лучший способ выполнить передачу данных из импортируемого кода в импортированный модуль.

...