sha*_*elk 1 python configparser argparse
我有一个Python脚本,需要很多参数。我目前使用的是configuration.ini文件(使用读取configparser),但希望允许用户使用命令行覆盖特定的参数。如果我只有两个参数,我会使用类似的东西:
if not arg1:
arg1 = config[section]['arg1']
Run Code Online (Sandbox Code Playgroud)
但是我不想为30个参数做这些。有什么简单的方法可以从cmd行中获取可选参数,并将其默认设置为config文件?
尝试以下操作,使用dict.update():
import argparse
import configparser
config = configparser.ConfigParser()
config.read('config.ini')
defaults = config['default']
parser = argparse.ArgumentParser()
parser.add_argument('-a', dest='arg1')
parser.add_argument('-b', dest='arg2')
parser.add_argument('-c', dest='arg3')
args = vars(parser.parse_args())
result = dict(defaults)
result.update({k: v for k, v in args.items() if v is not None}) # Update if v is not None
Run Code Online (Sandbox Code Playgroud)
使用此 ini 文件示例:
[default]
arg1=val1
arg2=val2
arg3=val3
Run Code Online (Sandbox Code Playgroud)
和
python myargparser.py -a "test"
Run Code Online (Sandbox Code Playgroud)
result 将包含:
{'arg1': 'test', 'arg2': 'val2', 'arg3': 'val3'}
Run Code Online (Sandbox Code Playgroud)
您可以从模块中使用ChainMapcollections。
从文档:
ChainMap将多个字典或其他映射组合在一起,以创建一个可更新的视图。[...]
查找顺序搜索基础映射,直到找到密钥为止。[...]
因此,您可以创建
config包含配置文件中的键值对的字典,cmd_line_args包含命令行中给出的字典的字典然后,创建一个ChainMap:
from collections import ChainMap
combined = ChainMap(cmd_line_args, config)
Run Code Online (Sandbox Code Playgroud)
当您访问时combined['arg1'],首先将在cmd_line_args字典中查找arg1 ,如果未在其中找到它,config[arg1]则将返回arg1 。您可以根据需要链接任意数量的字典,从而可以根据需要组合任意数量的默认值。