Импорт всех переменных из гибко определенного модуля - PullRequest
2 голосов
/ 08 апреля 2019

У меня есть основной config.py файл, а затем определенные файлы конфигурации клиента, например, client1_config.py.

. Я хотел бы импортировать все переменные из моего client1_config.py файла в мой * 1006.* файл.Подвох в том, что я хочу сделать это гибко во время выполнения в соответствии с переменной среды.Это будет выглядеть примерно так:

import os
import importlib

client = os.environ['CLIENT']
client_config = importlib.import_module(
    '{client}_config'.format(
        client=client))
from client_config import *

Этот фрагмент кода возвращает следующую ошибку: ModuleNotFoundError: No module named 'client_config'

Возможно ли (и как) добиться того, что я пытаюсь сделать, илиPython вообще не поддерживает этот вид импорта?

1 Ответ

1 голос
/ 09 апреля 2019

Вызов import_module уже импортирует конфигурацию клиента.from client_config import * предполагает, что client_config - это имя модуля, который вы пытаетесь импортировать, точно так же, как import os импортирует модуль os, даже если вы заранее создали переменную os:

os = "sys"
import os  # still imports the os module, not the sys module

Далее предположим, что у нас есть client1_config.py, который содержит только одну переменную:

dummy = True

Чтобы добавить его элементы в основное пространство имен config.py, чтобы вы могли получить к ним прямой доступ, выможет сделать следующее:

import importlib

client = "client1"

# Import the client's configuration
client_config = importlib.import_module(f"{client}_config")
print(client_config.dummy)  # True

# Add all elements from client_config
# to the main namespace:
globals().update({v: getattr(client_config, v)
                  for v in client_config.__dict__
                  if not v.startswith("_")})
print(dummy)  # True

Однако я бы предложил получить доступ к конфигурации клиента как config.client для ясности и во избежание перезаписи значений в файле конфигурации клиента в основном файле конфигурации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...