Импорт словаря в цикле в Python - PullRequest
0 голосов
/ 26 сентября 2019

Мой вопрос связан с этим один .У меня есть config_file, состоящий из словарей, как показано ниже:

config_1 = {
    'folder': 'raw1',
    'start_date': '2019-07-01'
}
config_2 = {
    'folder': 'raw2',
    'start_date': '2019-08-01'
}
config_3 = {
    'folder': 'raw3',
    'start_date': '2019-09-01'
}

У меня есть отдельный файл Python, который импортирует каждую конфигурацию и делает некоторые вещи:

from config_file import config_1 as cfg1
Do some stuff using 'folder' and 'start_date'

from config_file import config_2 as cfg2
Do some stuff using 'folder' and 'start_date'

from config_file import config_2 as cfg3
Do some stuff using 'folder' and 'start_date'

Я хотел быпоместить это в цикл, а не перечислять его 3 раза в файле python.Как я могу это сделать?

Ответы [ 3 ]

2 голосов
/ 26 сентября 2019

Если я правильно понимаю ваш вопрос, просто используйте importlib .Вкратце, то, что в python вы пишете как:

from package import module as alias_mod

в importlib, становится:

alias_mod = importlib.import_module('module', 'package')

или, эквивалентно:

alias_mod = importlib.import_module('module.package')

, например:

from numpy import random as rm

в importlib:

rm = importlib.import_module('random', 'numpy')

Еще одна интересная вещь - это код, предложенный в этом посте , который позволяет импортировать не только модули и пакеты, но инепосредственно функции и многое другое:

def import_from(module, name):
    module = __import__(module, fromlist=[name])
    return getattr(module, name)

Для вашего конкретного случая этот код должен работать:

import importlib

n_conf = 3
for in range(1, n_conf)
    conf = importlib.import_module('config_file.config_'+str(i))
    # todo somethings with conf 

Однако, если я могу дать вам несколько советов, я думаю, что лучше всего для вассоздать файл конфигурации json и прочитать файл вместо импорта модулей.Это намного удобнее.Например, в вашем случае вы можете создать файл config.json, например, так:

{
    "config_1": {
        "folder": "raw1",
        'start_date': '2019-07-01'
    },
    "config_2": {
        'folder': 'raw2',
        'start_date': '2019-08-01'
    },
    "config_3": {
        'folder': 'raw3',
        'start_date': '2019-09-01'
    }
}

Прочитайте файл json следующим образом:

import json
with open('config.json') as json_data_file:
    conf = json.load(json_data_file)

Теперь у вас в памяти есть простой питонсловарь с настройками конфигурации, которые вас интересуют:

conf['config_1']
# output: {'folder': 'raw1', 'start_date': '2019-07-01'}
1 голос
/ 26 сентября 2019

Вы можете использовать модуль inspect для получения всех возможных импортов из конфигурации, как показано ниже.

import config
import inspect

configs = [member[1] for member in inspect.getmembers(config) if 'config_' in member[0]]

configs

enter image description here

И затем вы можете перебирать все конфиги, это то поведение, которое вы хотели?

Подробнее об инспектировании можно прочитать здесь

.

0 голосов
/ 26 сентября 2019

Основываясь на комментарии @Daniel Mesejo, у меня сработало следующее решение:

package = 'config_file'
configs = ['config_1', 'config_2', 'config_3']
for i in configs:
    cfg = getattr(__import__(package, fromlist=[configs]), i)
    Do some stuff using 'folder' and 'start_date'
...