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?
3 Réponses :
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
Et puis vous pouvez parcourir toutes les configurations, est-ce le comportement que vous vouliez?
Vous pouvez en savoir plus sur inspect ici
.
Si je comprends bien votre question, utilisez simplement importlib a >. En un mot, ce que vous écrivez en python comme: dans importlib cela devient: ou, équivalent: par exemple: dans importlib: 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: Pour votre cas particulier, ce code devrait fonctionner: 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 Lisez le fichier json comme suit: Vous avez maintenant en mémoire un simple dictionnaire python avec les paramètres de configuration qui vous intéressent: conf['config_1']
# output: {'folder': 'raw1', 'start_date': '2019-07-01'}
import json
with open('config.json') as json_data_file:
conf = json.load(json_data_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'
}
}
import importlib
n_conf = 3
for in range(1, n_conf)
conf = importlib.import_module('config_file.config_'+str(i))
# todo somethings with conf
def import_from(module, name):
module = __import__(module, fromlist=[name])
return getattr(module, name)
rm = importlib.import_module('random', 'numpy')
from numpy import random as rm
config.json
comme celui-ci: alias_mod = importlib.import_module('module.package')
alias_mod = importlib.import_module('module', 'package')
from package import module as alias_mod
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'
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
?