parse_args()
可以接收一个已存在的 Namespace 并将其与当前解析的 args/options 合并;"当前解析"中的 options args/options 优先级更高,会覆盖现有 Namespace 中的任何内容:
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)
args = foo_parser.parse_args(['--foo', 'bar'], namespace=ConfigNamespace)
print(args)
我已经模拟了一个真实的配置文件选项。我进行了两次解析,一次作为“预解析”,以查看用户是否传递了配置文件,然后再进行“最终解析”,将可选的配置文件命名空间集成。
我有一个非常简单的JSON配置文件,config.ini:
[DEFAULT]
delimiter = |
当我运行这个:
import argparse
import configparser
parser = argparse.ArgumentParser()
parser.add_argument('-c', '--config-file', type=str)
parser.add_argument('-d', '--delimiter', type=str, default=',')
pre_args = parser.parse_args()
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)
args = parser.parse_args(namespace=ConfigNamespace)
print(args)
使用不同的命令行设置,我得到了以下结果:
./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=';')