2012-05-25 55 views
10

argparse在明確的情況下使用默認縮寫。在argparse中禁用縮寫

我不想縮寫,我想禁用它。 但是沒有在documentation中找到它。

可能嗎?

例子:

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('--send', action='store_true') 
parser.parse_args(['--se']) # returns Namespace(send=True) 

但我想它只是提供了完整的參數時,是真實的。防止用戶錯誤。

UPDATE:

我維卡斯答案後創建一個ticket at python bugtracker。它已經被處理了。

回答

5

從Python 3.5開始。0您可以通過以下啓動ArgumentParser禁用縮寫:

parser = argparse.ArgumentParser(allow_abbrev=False) 

另見the documentation

+0

雖然原來的問題來自三年多前,但這是今天的正確答案。 – jdferreira

+0

我選擇這個作爲正確的答案,因爲它現在更合適。 – jens

3

不,顯然這是不可能的。至少在Python 2.7.2中。

首先,我看了一下文檔 - 無濟於事。

然後我打開Lib \ argparse.py並查看源代碼。忽略很多細節,似乎每個參數是用正則表達式解析這樣的(argparse:2152):

# allow one or more arguments 
    elif nargs == ONE_OR_MORE: 
     nargs_pattern = '(-*A[A-]*)' 

此正則表達式將成功解析都「 - 」和「 - 」,所以我們有不能控制短期和長期的論點。其他正則表達式也使用 - *構造,因此它不依賴於參數的類型(無子參數,1個子參數等)。

在代碼後來雙破折號被轉換爲一個破折號(僅用於非可選參數),再次,不帶任何標誌由用戶控制:

# if this is an optional action, -- is not allowed 
    if action.option_strings: 
     nargs_pattern = nargs_pattern.replace('-*', '') 
     nargs_pattern = nargs_pattern.replace('-', '') 
+1

尼斯研究:) –

+0

我不認爲這個問題與短期和長期的選擇有關。 – Vikas

4

,以及並非沒有難看黑客。

代碼片段@Vladimir張貼,我想這不是你在找什麼。是這樣做的實際代碼是:

def _get_option_tuples(self, option_string): 
    ... 
    if option_string.startswith(option_prefix): 
    ... 

見檢查startswith==

而且您可以隨時擴展argparse.ArgumentParser以提供您自己的_get_option_tuples(self, option_string)來更改此行爲。我只是做了通過替換2個發生option_string.startswith(option_prefix)option_string == option_prefix和:

>>> parser = my_argparse.MyArgparse 
>>> parser = my_argparse.MyArgparse() 
>>> parser.add_argument('--send', action='store_true') 
_StoreTrueAction(option_strings=['--send'], dest='send', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None) 
>>> parser.parse_args(['--se']) 
usage: [-h] [--send] 
: error: unrecognized arguments: --se 

謹慎

方法_get_option_tuples帶有前綴_,這通常意味着在python一個私有方法的一個字。重寫一個私人信息並不是一個好主意。

+0

是的,這是我一直在尋找。 thx – jens

3

Python 2.7的另一種方法。讓我們變得笨重!假設你想識別沒有縮寫的--dog

p = argparse.ArgumentParser() 
p.add_argument('--dog') 
p.add_argument('--dox', help=argparse.SUPPRESS, metavar='IGNORE') 

通過增加從您希望只在第三個字母的參數不同的第二個參數--dox--d--do變得模糊。因此,解析器將拒絕識別它們。您需要添加代碼來捕獲產生的異常,並根據您調用的上下文parse_args來處理它。您可能還需要禁止/調整幫助文本。

help=...保持說法出來(每this)的默認幫助消息的選項列表,並且metavar='IGNORE'只是要清楚,你真的不是在做與此選項:)什麼。

+0

@ 2rs2ts另一種選擇。 – cxw

+0

是的,這對我來說很有用,因爲我通過我目前的apt回購版甚至無法訪問Python 3.5。謝謝! – 2rs2ts