2017-01-19 14 views
7

संयोजन मैं निम्नलिखित अजगर कार्यक्रम है: अगर मैं इस तरह कार्यक्रम आह्वानअजगर 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

कि 'डुप्लिकेट' एक 'संलग्न' कार्रवाई के बारे में है; यह एक डिफ़ॉल्ट 'स्टोर' है। मैं इसे फिर से खोल सकता हूं। – hpaulj

+0

जिस डुप्लिकेट को मैंने अस्वीकार कर दिया है वह है: http://stackoverflow.com/questions/8526675/python-argparse-optional-append-argument-with-choices – hpaulj

उत्तर

3

यह एक पुरानी का डुप्लिकेट है, लेकिन खुले, बग/मुद्दा है

http://bugs.python.org/issue9625 (argparse: 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) 

प्रस्तावित बग/मुद्दे पैच कोड के इस ब्लॉक में एक छोटा सा परिवर्तन करता है।

+0

वाह, इसे इतने सारे विचार देने के लिए धन्यवाद, इसे बंद करने के बाद भी नकल। मैं इसे बंद कर दूंगा और इसके बारे में भूल जाऊंगा। उच्च गुणवत्ता नियंत्रण/उत्तर के लिए +1! :-) – anorm

संबंधित मुद्दे