यह आपके लिए उपयोगी नहीं हो सकता है, लेकिन यदि आप sys.argv
को टुकड़ों में तोड़ सकते हैं तो यह समस्या सबसे आसान लगती है - अनिवार्य रूप से, आपको यह पता लगाने में सक्षम होना चाहिए कि कौन से टुकड़े "स्थितित्मक" तर्क हैं (वे जैसा कि आप कहते हैं, वास्तव में स्थितिगत नहीं हैं, वे कहीं भी हो सकते हैं) और कौन से टुकड़े किसी प्रकार का तर्क माना जाता है। नीचे दिए गए उदाहरण में, मैंने इसे आपके उदाहरण के साथ काम करने के लिए सेट अप किया है, लेकिन आप फाइलों पर sys.argv
को आसानी से विभाजित कर सकते हैं - या किसी निश्चित प्रकार की फ़ाइल पर। लिखने के लिए condition
फ़ंक्शन आपके ऊपर है। शेष (उम्मीद है) आत्म-व्याख्यात्मक होगा।
import argparse
import sys
import copy
import os
def split_list(lst,condition):
current=[]
out=[current]
for arg in lst:
current.append(arg)
if(condition(arg)):
current=[]
out.append(current)
return out
parser=argparse.ArgumentParser()
parser.add_argument('-m',action='store')
parser.add_argument('-r',default='0',action='store')
#pieces=split_list(sys.argv[1:],os.path.isfile)
pieces=split_list(sys.argv[1:],lambda x: x in ('foo','bar','baz','quux'))
options={} #use collections.OrderedDict if order matters -- or some more suitable data structure.
default=argparse.Namespace()
for args in pieces:
if(not args):
continue
ns=copy.deepcopy(default)
default=parser.parse_args(args[:-1],namespace=ns)
options[args[-1]]=default
print (options)
"तर्क राज्यों" का सेट निरंतर है? जैसे क्या आप सामने जानते हैं अगर केवल '(' foo ',' bar ',' baz ',' quux '...) का उपयोग कभी भी किया जाएगा? या क्या उपयोगकर्ता कुछ भी ऐसा करने में सक्षम है जिसे वे चाहते हैं कि वे चाहते हैं? – mgilson
@ मिग्निल्सन - जहां भी वे चाहते हैं; जो मैं देख रहा हूं वह फाइलनामों और प्रसंस्करण विकल्पों की एक सूची है। 'Argparse' के स्थितिगत तर्कों के संचालन के आधार पर, मुझे लगता है कि यह मॉडल-ब्रेकिंग कस्टम एक्शन के बिना नहीं किया जा सकता है, जो कि मैं वर्तमान में साथ खेल रहा हूं। –
मैं कस्टम कार्यों के बारे में भी सोच रहा था, लेकिन यह मुश्किल है क्योंकि Argparse मानते हैं कि सभी स्थितित्मक तर्क एक साथ दिए जाते हैं। एकमात्र उपाय हर जगह 'nargs = '*'' का उपयोग करना है और फिर अपने सभी कार्यों के अंदर यह सुनिश्चित करने के लिए जांचें कि आपको सही संख्या मिल गई है। (जो सबसे अच्छा नाजुक लगता है)। बेशक, यदि आप अनुमति देते हैं तो यह बहुत आसान हो जाता है: '-m 1 -f foo -r 2 -f bar -r 7 -f baz -m 6 -f quux' – mgilson