[英]How to make at least one argument required and have the possibility to take all arguments with argparse in Python?
該程序有兩個參數要處理:狀態和鍵。 我需要提供以下選項作為輸入:
最接近的事情是使用相互排斥的組,但是它無法同時將兩個參數作為輸入。
如https://stackoverflow.com/a/24911007/901925中所述 ,沒有內置的機制可以對此進行測試,但是在解析之后很容易進行這種測試。 假設參數的默認default
值為None
,那么這樣的測試可能是:
if args.state is None and args.key is None:
parser.error('At least one of the arguments is required ')
最終argparse
可能具有這種機制。 有一個錯誤請求,要求在組中提供更多的測試功能, http://bugs.python.org/issue11588
一種想法是添加以互斥組為模型的UsageGroups,但具有更通用的邏輯。 該代碼無法下載,但是我想聽聽這個示例是否很清楚。
parser = argparse.ArgumentParser(prog='prog')
group = parser.add_usage_group(kind='any', required=True)
group.add_argument('-s', '--state', metavar='state_value')
group.add_argument('-k', '--key', metavar='key_value')
args = parser.parse_args()
print(args)
並顯示錯誤消息:
usage: prog [-h] (-s state_value | -k key_value)
prog: error: group any(): some of the arguments [state, key] is required
使用行中的替代方法是(-s state_value, -k key_value)
,因為|
已經用於互斥的xor
關系。 usage
和錯誤消息可以自定義。
#!/usr/bin/python
#-*- coding:utf-8 -*-
import sys
paras = sys.argv.pop(0)
state_value = None
key_value = None
i=0
while i < len(paras):
if paras[i] == '-state':
state_value = paras[i]
elif paras[i] == '-key':
key_value = paras[i]
i += 2
if state_value:
# do something
pass
if key_value:
# do something
pass
我認為這超出了argparse的能力。 不過,您之后可以對返回的名稱空間執行簡單的驗證。 您應該在您的幫助中至少包含一次狀態或密鑰要求。
def validate(namespace, parser):
if not any(arg in {"state", "key"} for arg in vars(namespace).keys()):
parser.print_help()
parser.exit(2)
namespace = parser.parse_args()
validate(namespace, parser)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.