2014-12-05 49 views
2

例如:Python的Argparse「無線電」標誌與默認?

example.py

parser = argparse.ArgumentParser(description="Will take arguments... or none") 

parser.add_argument("-a", action="store_true") 
parser.add_argument("-b", action="store_true") 
parser.add_argument("-c", action="store_true") 
parser.add_argument("-d", action="store_true") 

args = parser.parse_args() 
print args 

我想example.py設置aTrue,但只有兩種:

  • ,則使用-a標誌
  • 沒有標誌使用

我想瞎搞與

parser.set_defaults(a=True, b=False)

parser.add_argument("-a", action="store_true", default=True)

,但他們將設置aTrue即使我決定使用b標誌。

回答

5

是使用默認值將設置爲真即使其他參數被指定。這將違反你的第二個要求,下面是一個簡單的修復與天真的條件檢查。

parser = argparse.ArgumentParser(description="Will take arguments... or none") 

parser.add_argument("-a", action="store_true") 
parser.add_argument("-b", action="store_true") 
parser.add_argument("-c", action="store_true") 
parser.add_argument("-d", action="store_true") 

args = parser.parse_args() 
if not (args.b or args.c or args.d): 
    args.a=True 
print args 
1

聽起來像你想要一個'單選按鈕'效果 - 只選擇幾個選擇之一。對一組標誌的替代將是一個有選擇的論點。

parser.add_argument('flag', choices=['a','b','c','d'], default='a', nargs='?') 

您可以檢查args.flag中的結果,這將是4個字符串之一。

很明顯,位置參數對由一個標誌替換,例如, -f

+0

是的,非常真實。我終於找到了另一個解決方案,我很快就會在這裏發佈。 – 2014-12-07 18:27:20

1

我去了以下解決方案:

parser = argparse.ArgumentParser(description="Will take arguments... or none") 

lettergroup = parser.add_mutually_exclusive_group() 

lettergroup.add_argument("-a", action="store_const", dest="letter", const="a", default="a") 
lettergroup.add_argument("-b", action="store_const", dest="letter", const="b") 
lettergroup.add_argument("-c", action="store_const", dest="letter", const="c") 
lettergroup.add_argument("-d", action="store_const", dest="letter", const="d") 

args = parser.parse_args() 

現在,值存儲在args.letter。如果沒有標記被調用,args.letter將具有值a。如果同時調用兩個標誌,則解析器將引發錯誤。

解決此問題的另一種方法。