2014-11-28 12 views
26

मैं ऐसे स्क्रिप्ट है:कैसे अधिक पुनरावृति करने के लिए तर्क

import argparse 

parser = argparse.ArgumentParser(
       description='Text file conversion.' 
       ) 
parser.add_argument("inputfile", help="file to process", type=str) 
parser.add_argument("-o", "--out", default="output.txt", 
        help="output name") 
parser.add_argument("-t", "--type", default="detailed", 
        help="Type of processing") 

args = parser.parse_args() 

for arg in args: 
    print(arg) 

लेकिन यह does not काम। मुझे त्रुटि मिलती है:

TypeError: 'Namespace' object is not iterable 

तर्क और उनके मूल्य पर पुनरावृत्ति कैसे करें?

>>> vars(args) 
{'foo': 'BAR'} 

तो

for key,value in vars(args).iteritems(): 
    # do stuff 

ईमानदार मुझे यकीन है कि तुम क्यों चाहते हैं नहीं कर रहा हूँ होने के लिए: यदि आप एक शब्दकोश चाहते

उत्तर

39

कृपया जोड़ें 'वार्स' अगर आप नाम स्थान वस्तु पर पुनरावृति करना चाहते हैं:

for arg in vars(args): 
    print arg, getattr(args, arg) 
13

Namespace वस्तुओं iterable, मानक डॉक्स निम्न कार्य करने का सुझाव नहीं हैं तर्कों को फिर से शुरू करने के लिए। कुछ हद तक एक तर्क पार्सर होने के उद्देश्य को हरा देता है।

+0

इसके लिए एक सामान्य उपयोग एक 'डीबग-इनपुट' मोड को कार्यान्वित कर रहा है जहां एक स्क्रिप्ट सभी इनपुट तर्कों और निकासों को प्रिंट करती है; यह सुनिश्चित करने के लिए सामान के लिए उपयोगी है कि डेटाटाइम इनपुट मानों का सही ढंग से व्याख्या किया गया –

0

ArgumentParser.parse_args रिटर्न एक iterable सरणियों के बजाय एक Namespace वस्तु।

आपके संदर्भ के लिए, https://docs.python.org/3/library/argparse.html#parsing-arguments

ArgumentParser parses arguments through the parse_args() method. This will inspect the command line, convert each argument to the appropriate type and then invoke the appropriate action. 

और यह माना जाता नहीं है कि की तरह इस्तेमाल किया जा सकता है। दस्तावेज़ में अपने उपयोग के मामले पर विचार करें, यह कहता है कि argparsesys.argv में उन लोगों को पार्स करने का तरीका बताएगा।, जिसका अर्थ है कि आपको उन तर्कों को फिर से शुरू करने की आवश्यकता नहीं है।

args = parser.parse_args() 

6

के बाद तर्क प्रदर्शित करने के लिए, का उपयोग करें:

print args # or print(args) in python3 

args वस्तु (प्रकार argparse.Namespace का) iterable (यानी न एक सूची) नहीं है, लेकिन यह एक .__str__ है विधि, जो मूल्यों को अच्छी तरह प्रदर्शित करता है।

args.out और args.type आपके द्वारा परिभाषित 2 तर्कों के मान दें। यह ज्यादातर समय काम करता है। getattr(args, key) मूल्यों तक पहुंचने का सबसे सामान्य तरीका है, लेकिन आमतौर पर इसकी आवश्यकता नहीं है।

vars(args) 

नामस्थान को एक शब्दकोश में बदल देता है, जिसे आप सभी शब्दकोश विधियों के साथ एक्सेस कर सकते हैं। यह docs में लिखा गया है।

रेफरी: डॉक्स का नाम स्थान पैरा - https://docs.python.org/2/library/argparse.html#the-namespace-object

+0

अच्छा लिखने के लिए धन्यवाद! – Hua2308

1

मैं args.__dict__ उपयोग कर रहा हूँ, जो आप अंतर्निहित dict संरचना पहुंचने देता है। फिर, अपने एक सरल कुंजी-मान यात्रा:

for k in args.__dict__: 
    print k, args.__dict__[k] 
1

अपने पार्सर से _actions पार्स एक सभ्य विचार की तरह लगता। Parse_args() चलाने के बजाय और फिर अपने नेमस्पेस से सामान चुनने का प्रयास करें।

import argparse 

parser = argparse.ArgumentParser(
       description='Text file conversion.') 
parser.add_argument("inputfile", help="file to process", type=str) 
parser.add_argument("-o", "--out", default="output.txt", 
       help="output name") 
parser.add_argument("-t", "--type", default="detailed", 
       help="Type of processing") 
options = parser._actions 
for k in options: 
    print(getattr(k, 'dest'), getattr(k, 'default')) 

यदि आप किसी अन्य लिपि में पैरामीटर के लिए पूर्व निर्धारित चूक की जरूरत है (उदाहरण के लिए एक समारोह में दिए गए विकल्पों वापस लौट कर) उदाहरण के लिए 'विकल्प' to be 'गंतव्य' हिस्से को संशोधित कर सकते हैं।

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