2016-03-16 61 views
0

[Python的3/argparse]Python 3 argparse:只有在未提供可選參數時才需要條件參數?

假設我的應用程序需要一個位置參數:

myApp.py [desired_function]

然而,如果用戶提供了一定可選的,然後desired_function不應要求。

myApp.py --list-functions

在這種情況下,如果--list-functions傳遞,我希望繼續申請,離開我設置desired_function到保持空的,因爲我的代碼會看到用戶通過--list-functions並採取相應行動的變量。

然而,如果用戶確實不提供--list-functions選項,那麼參數語法分析程序應該產生一個錯誤,因爲用戶沒有提供必需的位置參數。

如何使用argparse使desired_function需要位置只有如果用戶沒有提供可選的?

代碼我到目前爲止有:

parser = argparse.ArgumentParser(description="test app") 
parser.add_argument("desired_function", help="The function desired", action="store", default="", dest="func") 
parser.add_argument("--list-functions",help="List the available functions", action="store_true", default=False, dest="list_mode") 

在這種情況下,調用myApp.py --list-functions將失敗:(?NARGS =)

usage: myApp.py [-h] [--list-functions] desired_function 
myApp.py: error: the following arguments are required: desired_function 
+0

讓'--list-functions'產生'help'輸出可能是有意義的,所以'--list-functions'使用'action ='help''並且等價於'-h',那麼將函數列表併入'help'輸出中?或者,爲'desired_function'提供'choices',並讓'argparse'完成顯示它們的工作? – ShadowRanger

回答

0

這裏有一個簡單的解析器,使位置參數可選。

In [171]: parser=argparse.ArgumentParser() 
In [172]: parser.add_argument('func', nargs='?',default='foo') 
In [173]: parser.add_argument('--list',action='store_true') 
In [174]: args=parser.parse_args(['--list']) 
In [175]: args 
Out[175]: Namespace(func='foo', list=True) 
In [176]: args=parser.parse_args(['bar']) 
In [177]: args 
Out[177]: Namespace(func='bar', list=False) 
In [178]: parser.parse_args(['--list','bar']) 
Out[178]: Namespace(func='bar', list=True) 
In [179]: parser.parse_args([]) 
Out[179]: Namespace(func='foo', list=False) 

不要給位置參數dest參數;它已經在第一個字符串中獲得了一個。 store_true操作不需要默認;它會自動獲取False

有了這個設置,你可以檢查args.list;它True,然後只是忽略了args.func值。如果False,請使用args.func。如果你已經給func一個有意義的默認值,那麼用戶是否給你一個值也不重要。換句話說,它確實不是必需的。 (如果需要,定義默認值沒有意義)。或者,如果他們給你,你可以反對兩種:

In [184]: args=parser.parse_args(['--list','bar']) 
In [185]: if args.list and args.func!='foo': 
     parser.error('you stupid user ...') 
    .....:  
usage: ipython3 [-h] [--list] [func] 
ipython3: error: you stupid user ... 

我們可以去放置在mutually_exclusive_group這2個參數,並使得該組required進一步的步驟。這樣的團隊接受一個像這樣的可選位置。我認爲文檔已經夠清楚了,但如果需要的話,我可以擴展我的答案。

+0

這是否仍然只允許一個位置參數?即如果我出於某種原因想要在它之後添加另一個參數,「nargs =」?「'會干涉?假設的例子:'myApp.py processSomethingFromFileFileToProcess。dat',我會把文件名作爲第二個位置參數。另外,即使我沒有這樣做,通過多個位置參數應該仍然是一個錯誤...? – fdmillion

+0

用不同的組合進行實驗。這比做冗長的解釋更容易看到。 – hpaulj

+0

您可以有多個位置。但是,如果有多種分配參數的方式,則創建多個「可選」(?+ *)可能會非常棘手。互斥分組只允許一個位置。 – hpaulj

相關問題