2016-08-23 56 views
0

我使用argparse包來解析命令行參數。現在我想接受0,1或2個字符串並將它們放入列表中。確切地接受0,1或2個位置參數

我目前的做法是這樣的:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('strs', nargs='*') 

print(parser.parse_args([]).strs) 
print(parser.parse_args(['AAA']).strs) 
print(parser.parse_args(['AAA', 'BBB']).strs) 
print(parser.parse_args(['AAA', 'BBB', 'CCC']).strs) 

對於第一,第二和第三parse_args()的業績預期。對於最後一個我目前的做法是if len(parse_args.strs) > 2: raise。有沒有更好的方法可以讓argparse檢查我?

+0

重複的答案給出了一個自定義的Action類,例如我建議的。但我不確定這是對解析後測試的改進。 – hpaulj

回答

1

沒有在​​手段,以接受一系列的nargs,只是像重視12'+''*'

您可以編寫一個自定義Action類,用於檢查nargs='*'傳遞給它的值的數量。但是我認爲在解析之後執行該測試會很容易。

我可以找到一個錯誤/問題,探討如果你真的想進入該選項,增加一個範圍nargs選項。

如果您沒有其他定位符,您可以定義3個定位點,其中2個定位點爲?。你甚至可以將它們組合成一個具有通用名稱和'追加'動作的列表。我會探討這一點。

In [573]: p=argparse.ArgumentParser() 
In [574]: p.add_argument('str',action='append') 
In [575]: p.add_argument('str',nargs='?',action='append') 
In [576]: p.add_argument('str',nargs='?',action='append') 

In [577]: p.print_help() 
usage: ipython3 [-h] str [str] [str] 

positional arguments: 
    str 
    str 
    str 

optional arguments: 
    -h, --help show this help message and exit 

In [578]: p.parse_args('1 2 3'.split()) 
Out[578]: Namespace(str=['1', '2', '3']) 
In [579]: p.parse_args('1 3'.split()) 
Out[579]: Namespace(str=['1', '3', None]) 
In [580]: p.parse_args('1'.split()) 
Out[580]: Namespace(str=['1', None, None]) 

得到了default Nones。我可以糾正這與

p.add_argument('str', nargs='?', action='append', default=argparse.SUPPRESS) 

In [586]: p.parse_args('1 2'.split()) 
Out[586]: Namespace(str=['1', '2']) 
In [588]: p.parse_args('1 2 3 4'.split()) 
usage: ipython3 [-h] str [str] [str] 
ipython3: error: unrecognized arguments: 4 

(oops,這是代碼1-3的說法,但你明白了)。

+0

我相信你引用這個公開問題:http://bugs.python.org/issue11354。它似乎自2013年以來沒有任何活動。 –

+0

是的,有部分解決的問題存在大量積壓。這是一個低優先級的增強。它需要在幫助和使用格式方面進行比分析代碼本身更大的更改。 – hpaulj

相關問題