2017-01-19 74 views
7

時,我有以下的Python程序:的Python argparse:類型不一致結合 '選擇', 'NARGS' 和 '默認'

#!/usr/bin/env python 

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('arg', choices=['foo', 'bar', 'baz'], default='foo', nargs='*') 

args = parser.parse_args() 

print(args) 

如果我調用的程序是這樣的:

./prog.py 

輸出

Namespace(arg='foo') 

但如果我調用該程序與foo作爲參數:

./prog.py foo 

輸出

Namespace(arg=['foo']) 

問題

我怎樣才能得到arg的默認值成爲list

我已經試過

我試過設置default=['foo']但其結果是:

prog.py: error: argument arg: invalid choice: ['foo'] (choose from 'foo', 'bar', 'baz') 
+1

這是重複「是關於'append'行動;這是默認的'商店'之一。我可能會重新打開它。 – hpaulj

+0

,我拒絕重複的是:http://stackoverflow.com/questions/8526675/python-argparse-optional-append-argument-with-choices – hpaulj

回答

3

這是一個古老的重複,而是開放的,錯誤/問題

http://bugs.python.org/issue9625argparse: Problem with defaults for variable nargs when using choices

positional*得到一些特殊的處理。它的默認值總是通過choices測試通過,如果你不提供值。

相比之下,與一個optional

In [138]: p=argparse.ArgumentParser() 
In [139]: a=p.add_argument('--arg',choices=['foo','bar','baz'],nargs='*') 

In [140]: p.parse_args([]) 
Out[140]: Namespace(arg=None) 
In [141]: a.default=['foo'] 
In [142]: p.parse_args([]) 
Out[142]: Namespace(arg=['foo']) 

的情況下默認是未經測試接受:

In [143]: a.default=['xxx'] 
In [144]: p.parse_args([]) 
Out[144]: Namespace(arg=['xxx']) 

相關的代碼是:

def _get_values(self, action, arg_strings): 
    ... 
    # when nargs='*' on a positional, if there were no command-line 
    # args, use the default if it is anything other than None 
    elif (not arg_strings and action.nargs == ZERO_OR_MORE and 
      not action.option_strings): 
     if action.default is not None: 
      value = action.default 
     else: 
      value = arg_strings 
     self._check_value(action, value) 

所提出的bug /問題修補程序會對此代碼塊進行小改動。

+0

哇,感謝給這個這麼多以爲你關閉它作爲一個即使重複。我會關閉它並忘記它。 +1爲高質量審覈/答案! :-) – anorm