1
votes

Importer le dictionnaire en boucle en Python

Ma question concerne cette une . J'ai un config_file composé de dictionnaires comme indiqué ci-dessous:

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'

J'ai alors un fichier python séparé qui importe chaque configuration et fait des choses:

XXX

Je voudrais mettre ceci dans une boucle plutôt que de l'avoir répertorié 3 fois dans le fichier python. Comment puis je faire ça?


4 commentaires

faites-vous la même chose sur les trois fichiers de configuration?


oui, ils ont juste des valeurs différentes pour les variables.


Donc, il semble eval, ne fonctionne pas, comme je l'ai d'abord commenté. Mais ceci autre question a une autre solution.


de config_file import config_1, config_2, config_3 ?


3 Réponses :


1
votes

Vous pouvez utiliser le module inspect pour obtenir toutes les importations possibles à partir de la configuration comme suit.

import config
import inspect

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

configs

entrez la description de l'image ici

Et puis vous pouvez parcourir toutes les configurations, est-ce le comportement que vous vouliez?

Vous pouvez en savoir plus sur inspect ici

.


0 commentaires

2
votes

Si je comprends bien votre question, utilisez simplement importlib a >. En un mot, ce que vous écrivez en python comme:

conf['config_1']
# output: {'folder': 'raw1', 'start_date': '2019-07-01'}

dans importlib cela devient:

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

ou, équivalent:

{
    "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'
    }
}

par exemple:

import importlib

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

dans importlib:

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

Autre chose intéressante est ce code proposé dans ce post , qui vous permet d'importer non seulement des modules et des packages mais aussi directement des fonctions et plus:

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

Pour votre cas particulier, ce code devrait fonctionner:

from numpy import random as rm

Cependant, si je peux vous donner quelques conseils, je pense la meilleure chose pour vous est de créer un fichier de configuration json et de lire le fichier au lieu d'importer des modules. C'est beaucoup plus confortable. Par exemple, dans votre cas, vous pouvez créer un fichier config.json comme celui-ci:

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

Lisez le fichier json comme suit:

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

Vous avez maintenant en mémoire un simple dictionnaire python avec les paramètres de configuration qui vous intéressent:

from package import module as alias_mod


0 commentaires

0
votes

D'après le commentaire de @ MikeMajara, la solution suivante a fonctionné pour moi:

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'


0 commentaires