[英]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.