2016-01-23 52 views
3

我正在設計一個滿足某些規範的工具。我有一個場景,我希望參數包含其字符串-。請注意以下行中的arg-1需要將`-`字符嵌入python argparse的參數中

python test.py --arg-1 arg1Data 

我使用python27的​​庫。出於某種原因,這種爭論與上述試驗混爲一談。

我的問題是如何避免這種情況?我怎麼能保持-在我的論點?

的樣品程序(包含-,如果這個被除去一切正常):

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("--arg-1", help="increase output verbosity") 
args = parser.parse_args() 
if args.args-1: 
    print "verbosity turned on" 
+1

Python將'args.args-1'解釋爲'args.args - 1',相減。 – hpaulj

回答

7

的Python argparse模塊用下劃線替換破折號,從而:

if args.arg_1: 
    print "verbosity turned on" 

Python的DOC(第二段部15.4.3.11. dest)的規定:

任何內部將個字符轉換爲_個字符使 確定該字符串是有效的屬性名稱。

+1

@sudhishkr'--arg-1'是一個boolean值(store_true),它表示當它在命令行中傳遞時爲TRUE,而當它不在命令行參數中時爲FALSE。這就是它的工作原理。布爾參數不能有值 – felipsmartins

+0

我的那個不好。我在提出評論後才意識到這一點。我刪除了我的,看起來像你立即迴應。我正在採取你的方法,但會選擇Dan.D的答案作爲本Q的正確答案,因爲它適用於任何特殊字符。謝謝@felipsmartins – sudhishkr

1
import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("--arg-1", help="increase output verbosity") 
parser.add_argument("arg-2") 
args = parser.parse_args() 
print(args) 

生產:

1750:~/mypy$ python stack34970533.py -h 
usage: stack34970533.py [-h] [--arg-1 ARG_1] arg-2 

positional arguments: 
    arg-2 

optional arguments: 
    -h, --help  show this help message and exit 
    --arg-1 ARG_1 increase output verbosity 

1751:~/mypy$ python stack34970533.py --arg-1 xxx yyy 
Namespace(arg-2='yyy', arg_1='xxx') 

第一個參數是一個optional。您可以在命令行中使用'--arg-1',但該值存儲爲args.arg_1。 Python會將args.arg-1解釋爲args.arg - 1。 unix命令行有很長的歷史,允許帶有-的標誌。它試圖平衡兩種傳統。

它使您完全控制positionalsdest屬性,並且不會將-更改爲_。如果你想訪問你必須使用getattr方法。有問題討論這種行爲是否應該改變。但現在,如果你想讓自己變得很難,那就是你的事情。

在內部,​​通過getattrsetattr訪問namespace以最大限度地減少對屬性名稱的限制。