2016-09-12 7 views
7

क्या तर्क के लिए पारित विकल्पों के tuple तक पहुंच बनाना संभव है? यदि हां, तो कैसे मैं अगर मैंargparser में तर्क के लिए पारित विकल्पों तक पहुंच?

parser = argparse.ArgumentParser(description='choose location') 
parser.add_argument(
    "--location", 
    choices=('here', 'there', 'anywhere') 
) 
args = parser.parse_args() 

है यह

उदाहरण के लिए

के बारे में जाना मैं टपल ('here', 'there', 'anywhere') का उपयोग कर सकते हैं?

उत्तर

7

यह पता चला है कि parser.add_argument वास्तव में संबंधित Action संबंधित करता है। आपको लगता है कि के बंद विकल्प चुन सकते हैं:

>>> import argparse 
>>> parser = argparse.ArgumentParser(description='choose location') 
>>> action = parser.add_argument(
...  "--location", 
...  choices=('here', 'there', 'anywhere') 
...) 
>>> action.choices 
('here', 'there', 'anywhere') 

ध्यान दें कि (AFAIK) इस कहीं भी दर्ज नहीं किया जाता है और सूचना के बिना, आदि आदि बदलने के लिए एक "कार्यान्वयन विस्तार" और इसलिए विषय माना जा सकता है

कोई भी सार्वजनिक रूप सेArgumentParser पर जोड़े गए कार्यों को प्राप्त करने के बाद पहुंचने के लिए पहुंच योग्य तरीका नहीं है। मुझे विश्वास है कि वे parser._actions रूप में उपलब्ध हैं यदि आप कार्यान्वयन के विवरण के साथ के बारे में mucking जाना (और किसी भी है कि के साथ शामिल जोखिमों को ग्रहण) करने को तैयार हैं ...


आपका सबसे अच्छा शर्त शायद के लिए एक निरंतर बनाने के लिए है स्थान विकल्प और फिर अपने कोड में इसका उपयोग करें:

LOCATION_CHOICES = ('here', 'there', 'anywhere') 

parser = argparse.ArgumentParser(description='choose location') 
parser.add_argument(
    "--location", 
    choices=LOCATION_CHOICES 
) 
args = parser.parse_args() 

# Use LOCATION_CHOICES down here... 
+1

पीएफटी चीनी मिट्टी के बरतन के आदेशों के साथ चिपकने वाला मजा क्या है? लेम्मे में कुछ नलसाजी है!;) –

+1

@ एडमस्मिथ - मैंने जो देखा है, उससे 'Argparse' internals बहुत स्थिर हैं (लेकिन मुझे उस पर उद्धरण न दें ;-) – mgilson

+0

दाएं। जब तक वे नहीं होते हैं तब तक वे स्थिर होते हैं और आपका एप्लिकेशन (और बाद में दुनिया) अप्रत्याशित रूप से दुर्घटनाग्रस्त हो जाता है जब उपयोगकर्ता तर्क के रूप में प्रवेश करता है '--ritual Iä! _Iä! _Cthulhu_fhtagn! ' –

2

एक बेहतर तरीका हो सकता है, लेकिन मुझे दस्तावेज़ में कोई भी दिखाई नहीं देता है। आप पार्सर विकल्प जानते हैं कि आप ऐसा करने में सक्षम होना चाहिए: "। अरे, आप शायद मेरे साथ खिलवाड़ नहीं किया जाना चाहिए" mgilson के जवाब में

parser = argparse.ArgumentParser() 
parser.add_argument("--location", choices=("here", "there", "everywhere")) 

storeaction = next(a for a in parser._actions if "--location" in a.option_strings) 

storeaction.choices 
# ('here', 'there', 'everywhere') 

के रूप में, तक पहुँचने _actions विशेषता गैर-दस्तावेजी है और रेखांकित उपसर्ग का मतलब अगर यह पाइथन के संस्करणों के बीच टूट जाता है तो आश्चर्यचकित न हों।

1

क्या add_argument रिटर्न, अगर आप ipython की तरह एक इंटरैक्टिव सत्र में किसी भी परीक्षण करना, बदले आप चेहरे में घूर रहा है के सवाल पर:

In [73]: import argparse 
In [74]: parser=argparse.ArgumentParser() 
In [75]: parser.add_argument('foo',choices=['one','two','three']) 
Out[75]: _StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two', 'three'], help=None, metavar=None) 
In [76]: _.choices 
Out[76]: ['one', 'two', 'three'] 

ध्यान दें कि जैसे अन्य तरीकों add_argument_group, add_subparsers, add_parser, add_mutually_exclusive_group सभी लौटने वाली वस्तुओं का उपयोग किया जा सकता है। तथ्य यह है कि add_argument दस्तावेज को वापस करने के रूप में दस्तावेज नहीं किया गया है, मुझे लगता है, एक दस्तावेज़ीकरण निरीक्षण। आम तौर पर उपयोगकर्ताओं को इसका उपयोग करने की आवश्यकता नहीं होती है, लेकिन अर्ध-डेवलपर के रूप में मैं इसे हर समय उपयोग करता हूं। argparse के लिए प्रलेखन औपचारिक विनिर्देश नहीं है कि मॉड्यूल क्या कर सकता है या नहीं कर सकता है; यह एक निर्देश पुस्तिका से अधिक है, एक ट्यूटोरियल से एक कदम है, लेकिन स्पष्ट रूप से एक संदर्भ नहीं है।

parser._actions का उपयोग आसान है, लेकिन एक कदम गहराई में गहरा है। मैंने लगभग सभी बग/मुद्दों का पालन किया है और इस बारे में कोई भी विचार नहीं कर सकता है जो इसमें बदलाव लाएगा। संभावित परिवर्तनों का एक बड़ा बैकलॉग है, लेकिन पिछड़े संगतता मुद्दों को बनाने के डर पर डेवलपर्स को कम-अखंडता में कम कर दिया गया है। argparse की कार्यक्षमता को बदलने के लिए दस्तावेज़ को बदलना आसान है।

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