Argparse:文件中的默认值

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文件?

ett*_*any 6

尝试以下操作,使用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)


Thi*_*lle 5

您可以从模块中使用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 。您可以根据需要链接任意数量的字典,从而可以根据需要组合任意数量的默认值。