2014-02-11 37 views
2

我試圖用這樣一句話:argparse:narg ='*'的默認值?

parser = argparse.ArgumentParser() 
parser.add_argument('-m', '--music', nargs='*', default=False, const=True) 
args = parser.parse_args() 
print(args.music) 

但得到這個錯誤:

`builtins.ValueError: nargs must be '?' to supply const` 

我想要做的是:

  • 如果-m在args列表中,但內部消除任何值,args.music會給我真
  • 如果-m是在args列表中並且有'N'va梅毒,args.music會給我所有的值
  • 如果-m不在的args列表的列表,指定參數時,音樂將返回False

第二和lastOne的工作,但,當我嘗試使用const的我得到了一個錯誤

+1

真的不知道爲什麼你要第一個點( 「如果'M'在args列表中,但沒有任何價值......」) 。對args.music進行測試是False(或者「not False」,取決於你的邏輯),告訴你是否處於第三種情況。然後對於前兩個,你只需要檢查參數 –

回答

3

你可以使用一個custom action

import argparse 
class EmptyIsTrue(argparse.Action): 
    def __call__(self, parser, namespace, values, option_string=None): 
     if len(values) == 0: 
      values = True 
     setattr(namespace, self.dest, values) 

parser = argparse.ArgumentParser() 
parser.add_argument('-m', '--music', nargs='*', default=False, action=EmptyIsTrue) 
print(parser.parse_args([])) 
# Namespace(music=False) 

print(parser.parse_args(['-m'])) 
# Namespace(music=True) 

print(parser.parse_args('-m 1 2'.split())) 
# Namespace(music=['1', '2']) 

如果只有一個參數來處理這種方式,然後

arg.music = True if len(arg.music) == 0 else arg.music 

更簡單。如果你有很多這樣的參數,那麼定義一個自定義動作可以減少重複,並幫助確保所有參數都以相同的方式處理。

0

的​​部分後,下面的技巧解決您的問題:

import argparse 

# Same as your code above 
parser = argparse.ArgumentParser() 
parser.add_argument('-m', '--music', nargs='*', default=False) 
args = parser.parse_args() 

# Modifies args.music: [] -> True 
args.music = True if args.music==[] else args.music 

print(args.music) 

在命令行測試,它提供了:

$ python /tmp/blah.py -m 
True 

$ python /tmp/blah.py -m 1 -m 2 
['2'] 

$ python /tmp/blah.py -m 1 2 3 
['1', '2', '3'] 

$ python /tmp/blah.py 
False 
+0

這是我找到的解決方案的列表的長度,但我想知道是否有可能沒有額外的代碼 – karim

+0

沒有問題。下次,請讓我們知道你有一個工作解決方案。 –

+0

在'parse_args'之後改進'args'屬性並沒有什麼不妥或不合理的地方。把它全部包裝在一個函數調用中,沒有人會更聰明。 – hpaulj

0

什麼:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('-m', '--music', nargs='*', default=False) 
args = parser.parse_args() 

if vars(args).get('music', False) is not False: 
    if not args.music: 
     args.music = True 
print args.music 

輸出:

tmp:/>python arg.py 
False 
tmp:/>python arg.py -m 
True 
tmp:/>python arg.py -m 1 2 3 
['1', '2', '3'] 
tmp:/>