簡體   English   中英

如何在Python中至少需要一個參數並且可以使用argparse接受所有參數?

[英]How to make at least one argument required and have the possibility to take all arguments with argparse in Python?

該程序有兩個參數要處理:狀態和鍵。 我需要提供以下選項作為輸入:

  • 編狀態state_value
  • 編-key key_value
  • 編-state state_value -key key_value

最接近的事情是使用相互排斥的組,但是它無法同時將兩個參數作為輸入。

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.

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