簡體   English   中英

Argparse:文件中的默認值

[英]Argparse: defaults from file

我有一個Python腳本,需要很多參數。 我當前使用的是configuration.ini文件(使用configparser讀取),但希望允許用戶使用命令行覆蓋特定的參數。 如果我只有兩個參數,我會使用類似的東西:

if not arg1:
    arg1 = config[section]['arg1']

但是我不想為30個參數做這些。 有什么簡單的方法可以從cmd行中獲取可選參數,並將其默認設置為config文件?

您可以從collections模塊使用ChainMap

從文檔中:

ChainMap將多個字典或其他映射組合在一起,以創建一個可更新的視圖。 [...]

查找順序搜索基礎映射,直到找到密鑰為止。 [...]

因此,您可以創建

  • 一個config字典,其中包含配置文件中的鍵/值對,
  • 一個cmd_line_args字典,其中包含命令行中給出的內容

然后,創建一個ChainMap:

from collections import ChainMap
combined = ChainMap(cmd_line_args, config)

當您訪問combined['arg1'] ,將首先在cmd_line_args字典中查找arg1,如果在那里找不到,將返回config[arg1] 您可以根據需要鏈接任意數量的字典,從而可以根據需要組合任意數量的默認值。

使用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

在此ini文件示例中:

[default]
arg1=val1
arg2=val2
arg3=val3

python myargparser.py -a "test"

result將包含:

{'arg1': 'test', 'arg2': 'val2', 'arg3': 'val3'}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM