parse_args()
peut prendre un Namespace existant et fusionner le Namespace existant avec les args/options qu'il analyse actuellement; les options args/options dans le "parsing actuel" ont la priorité et remplacent tout ce qui se trouve dans le Namespace existant:
foo_parser = argparse.ArgumentParser()
foo_parser.add_argument('--foo')
ConfigNamespace = argparse.Namespace()
setattr(ConfigNamespace, 'foo', 'foo')
args = foo_parser.parse_args([], namespace=ConfigNamespace)
print(args)
# Namespace(foo='foo')
# la valeur `bar` remplacera la valeur `foo` de ConfigNamespace
args = foo_parser.parse_args(['--foo', 'bar'], namespace=ConfigNamespace)
print(args)
# Namespace(foo='bar')
Je l'ai simulé pour une véritable option de fichier de configuration. Je l'analyse deux fois, une fois, comme une "pré-analyse" pour voir si l'utilisateur a passé un fichier de configuration, et ensuite de nouveau pour l'analyse finale qui intègre le Namespace du fichier de configuration facultatif.
J'ai ce fichier de configuration JSON très simple, config.ini:
[DEFAULT]
delimiter = |
et quand j'exécute ceci:
import argparse
import configparser
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--config-file', type=str)
parser.add_argument('-d', '--delimiter', type=str, default=',')
# Analyser les args de la ligne de commande pour voir si un fichier de configuration est spécifié
pre_args = parser.parse_args()
# Même si la configuration n'est pas spécifiée, besoin d'un Namespace vide à passer à `parse_args()` final
ConfigNamespace = argparse.Namespace()
if pre_args.config_file:
config = configparser.ConfigParser()
config.read(pre_args.config_file)
for name, val in config['DEFAULT'].items():
setattr(ConfigNamespace, name, val)
# Analyser de nouveau les args de la ligne de commande, fusion avec ConfigNamespace,
# les args de la ligne de commande ont la priorité
args = parser.parse_args(namespace=ConfigNamespace)
print(args)
avec différents paramètres de ligne de commande, j'obtiens:
./main.py
Namespace(config_file=None, delimiter=',')
./main.py -c config.ini
Namespace(config_file='config.ini', delimiter='|')
./main.py -c config.ini -d \;
Namespace(config_file='config.ini', delimiter=';')