2012-08-08 14 views
3

我想這個功能:Python argparse:如何將`--add`改爲`add`而仍然是可選參數?

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument("--add", help="Add a new name to the list of names", 
        action="store") 
args = parser.parse_args() 
if args.add: 
    print "'%s' was added to the list of names." % args.add 
else: 
    print "Just executing the program baby." 

這樣:

$ python program.py --add Peter 
'Peter' was added to the list of names. 

但是,當我改變--addadd

$ python program.py add Peter 
'Peter' was added to the list of names. 

我可以--add代替add像這樣實現這一目標它不再是可選的,我怎樣才能讓它成爲可選的,但沒有那些--標誌? (最好也使用​​庫)

+1

了'--'前綴是'argparse'使用,因爲它試圖爲強制所有程序的一貫風格,(可選參數看起來他們是可選的)。如果你想用一種非常不同的風格來處理參數,你可能根本不需要'argparse'。 – SingleNegationElimination 2012-08-08 12:09:30

+0

好的一點,你認爲哪種解決方案最適合在不執行這種可選參數類型的'argparse'庫之外? – Bentley4 2012-08-08 12:36:41

+1

好吧,我不會違背推薦的風格。這只是令人困惑@。@ – SingleNegationElimination 2012-08-08 12:43:22

回答

2

你想要什麼,實際上被稱爲「位置參數」。 你可以這樣解析它們:

import argparse                
parser = argparse.ArgumentParser()            
parser.add_argument("cmd", help="Execute a command",       
        action="store", nargs='*')         
args = parser.parse_args()              
if args.cmd:                 
    cmd, name = args.cmd              
    print "'%s' was '%s'-ed to the list of names." % (name, cmd)    
else:                   
    print "Just executing the program baby."         

,讓你可以指定不同的操作能力:

$ python g.py add peter 
'peter' was 'add'-ed to the list of names. 

$ python g.py del peter 
'peter' was 'del'-ed to the list of names. 

$ python g.py 
Just executing the program baby. 
+0

謝謝,這就是我想要的。 – Bentley4 2012-08-08 12:46:25

1

你可以使用sub-commands實現這一行爲。試着像下面

import argparse 
parser = argparse.ArgumentParser() 

subparsers = parser.add_subparsers(title='Subcommands', 
    description='valid subcommands', 
    help='additional help') 

addparser = subparsers.add_parser('add') 
addparser.add_argument('names', nargs='*') 

args = parser.parse_args() 

if args.names: 
    print "'%s' was added to the list of names." % args.names 
else: 
    print "Just executing the program baby." 

注意的是,使用nargs='*'意味着args.names現在是一個清單,不像你args.add,這樣你就可以添加以下名稱的任意數量add(你必須修改你如何處理這個論點)。以上就可以被稱爲如下:

$ python test.py add test 
'['test']' was added to the list of names. 

$ python test.py add test1 test2 
'['test1', 'test2']' was added to the list of names. 
+1

這是非常好的,但'python test.py'給出了'太少的參數'錯誤。我想讓這個'add'參數可選。 – Bentley4 2012-08-08 10:06:42

+1

這是一個很好的觀點。不幸的是,當使用子命令時,至少必須指定一個子命令 - 目前不可能有可選的子命令。是否有你想將'--add'改爲'add'的原因。看起來你最好的選擇是讓'--add'保持原樣。 – Chris 2012-08-08 10:52:21

+0

我想這樣做的原因是因爲我發現它對於新用戶來說更清潔並且不那麼令人困惑。作爲例子,請參閱taskwarrior程序。您還可以保留這些標誌,以獲得具有與其他可選參數類似功能的新類型的可選參數。 例子:'python example.py -v command_A' 'python example.py -v command_B' 這裏'-v'對於兩個不同的可選命令'command_A'和'command_B'將具有相同的功能。 – Bentley4 2012-08-08 12:21:43

相關問題