2013-02-04 15 views
15

का उपयोग कर अग्रणी ऋण चिह्न (ऋणात्मक संख्याओं) के साथ स्थितित्मक तर्कों का विश्लेषण कैसे करें I integers की अल्पविराम से अलग सूची वाली एक आवश्यक, स्थितित्मक तर्क को पार्स करना चाहते हैं। पहले पूर्णांक एक अग्रणी शून्य से शामिल हैं ('-') पर हस्ताक्षर, argparse शिकायत:argparse

import argparse 
parser = argparse.ArgumentParser() 
parser.add_argument('positional') 
parser.add_argument('-t', '--test', action='store_true') 
opts = parser.parse_args() 
print opts 

$ python example.py --test 1,2,3,4 
Namespace(positional='1,2,3,4', test=True) 

$ python example.py --test -1,2,3,4 
usage: example.py [-h] [-t] positional 
example.py: error: too few arguments 

$ python example.py --test "-1,2,3,4" 
usage: example.py [-h] [-t] positional 
example.py: error: too few arguments 

मैंने देखा है लोगों - झंडा चरित्र के रूप में के अलावा कुछ अन्य चरित्र उपयोग करने का सुझाव है, लेकिन मैं नहीं बल्कि ऐसा नहीं चाहते हैं । --test और -1,2,3,4 दोनों मान्य तर्कों के रूप में अनुमति देने के लिए argparse को कॉन्फ़िगर करने का कोई और तरीका है?

+2

शायद ज़रुरत पड़े किसी को भी इस की जरूरत है, अगर --test तर्क ले लिया तुम कर सकते हो: 'अजगर example.py --test = -1,2,3,4' – lababidi

उत्तर

21

आप अपने कमांड लाइन तर्क में एक -- डालने की आवश्यकता:

$ python example.py --test -- -1,2,3,4 
Namespace(positional='-1,2,3,4', test=True) 

डबल-पानी का छींटा argparse किसी भी अधिक वैकल्पिक स्विच की तलाश में बंद हो जाता है; यह कमांड लाइन उपकरणों के लिए बिल्कुल इस उपयोग मामले को संभालने का defacto मानक तरीका है।

+0

आह, मैं 'मानक से अनजान थे 'डबल-डैश का उपयोग करने के लिए (अभी भी एक * निक्स नौसिखिया, अभी भी सीख रहा है ...) जानकारी के लिए धन्यवाद! – Inactivist

+1

यह सिर्फ मुझे त्रुटि देता है: अपरिचित तर्क: - '(पाइथन 2.7.3 के तहत argparse) – panzi

+1

@panzi: पाइथन 2.7.5 के तहत ऐसी कोई समस्या नहीं है। –

8

documentation से: नहीं नज़र एक ऋणात्मक संख्या आप सबसे अधिक * nix प्रणालियों में के रूप में -- साथ "पलायन" यह चाहिए की तरह

The parse_args() method attempts to give errors whenever the user has clearly made a mistake, but some situations are inherently ambiguous. For example, the command-line argument -1 could either be an attempt to specify an option or an attempt to provide a positional argument. The parse_args() method is cautious here: positional arguments may only begin with - if they look like negative numbers and there are no options in the parser that look like negative numbers:

-1,2,3,4 के बाद से करता है।

#test.py 
import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('positional', nargs='*') #'+' for one or more numbers 

print parser.parse_args() 

आउटपुट::

$ python test.py -1 2 3 -4 5 6 
Namespace(positional=['-1', '2', '3', '-4', '5', '6']) 

एक तीसरा रास्ता तुम क्या चाहते प्राप्त करने के लिए उपयोग करने के लिए है

एक अन्य समाधान स्थितीय के लिए nargs का उपयोग करें और के रूप में अंतरिक्ष अलग की गई संख्याएं पारित करने के लिए किया जाएगा parse_args के बजाय। आप पार्सर को स्थितीय तर्क जोड़ सकते हैं और इसे मैन्युअल रूप से पार्स बजाय नहीं है:

import argparse 

parser = argparse.ArgumentParser() 
parser.add_argument('--test', action='store_true') 

parsed, args = parser.parse_known_args() 
print parsed 
print args 

परिणाम:

$ python test.py --test -1,2,3,4            
Namespace(test=True) 
['-1,2,3,4']  

इस नुकसान यह है कि सहायता पाठ कम जानकारीपूर्ण किया जाएगा है।

+0

मैंने प्रलेखन देखा, लेकिन यह सोच रहा था कि मानक व्यवहार को बदलने के लिए कोई चाल थी या नहीं। इस बिंदु पर, मुझे लगता है कि चार अलग-अलग स्थितित्मक तर्कों की आवश्यकता होगी या '-' बचने के तंत्र की तुलना में अंतरिक्ष डिलीमीटर का उपयोग करना बेहतर होगा। सहायता के लिए धन्यवाद। – Inactivist

+0

@Inactivist मैंने '-1,2,3,4' शैली स्थिति को अनुमति देने के लिए एक तीसरे विधि के साथ अपना उत्तर अपडेट किया। – Bakuriu

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