2012-06-30 8 views
5

मैं "तर्क स्थिति" के साथ स्थितित्मक तर्कों को जोड़ना चाहता हूं जो तब होता है जब वे होते हैं। उदाहरण के लिए, निम्न आदेश पंक्ति:नामांकित तर्कों के साथ सहयोगी स्थितित्मक तर्कों का तर्क दे सकता है?

foo: m=1, r=0 (default value for r) 
bar: m=1, r=2 
baz: m=1, r=7 
quux: m=6, r=7 

इस argparse मॉड्यूल के साथ किया जा सकता है:

script.py -m 1 foo -r 2 bar -r 7 baz -m 6 quux 

निम्नलिखित संघों का उत्पादन करना चाहिए?

+0

"तर्क राज्यों" का सेट निरंतर है? जैसे क्या आप सामने जानते हैं अगर केवल '(' foo ',' bar ',' baz ',' quux '...) का उपयोग कभी भी किया जाएगा? या क्या उपयोगकर्ता कुछ भी ऐसा करने में सक्षम है जिसे वे चाहते हैं कि वे चाहते हैं? – mgilson

+0

@ मिग्निल्सन - जहां भी वे चाहते हैं; जो मैं देख रहा हूं वह फाइलनामों और प्रसंस्करण विकल्पों की एक सूची है। 'Argparse' के स्थितिगत तर्कों के संचालन के आधार पर, मुझे लगता है कि यह मॉडल-ब्रेकिंग कस्टम एक्शन के बिना नहीं किया जा सकता है, जो कि मैं वर्तमान में साथ खेल रहा हूं। –

+0

मैं कस्टम कार्यों के बारे में भी सोच रहा था, लेकिन यह मुश्किल है क्योंकि Argparse मानते हैं कि सभी स्थितित्मक तर्क एक साथ दिए जाते हैं। एकमात्र उपाय हर जगह 'nargs = '*'' का उपयोग करना है और फिर अपने सभी कार्यों के अंदर यह सुनिश्चित करने के लिए जांचें कि आपको सही संख्या मिल गई है। (जो सबसे अच्छा नाजुक लगता है)। बेशक, यदि आप अनुमति देते हैं तो यह बहुत आसान हो जाता है: '-m 1 -f foo -r 2 -f bar -r 7 -f baz -m 6 -f quux' – mgilson

उत्तर

1

यह आपके लिए उपयोगी नहीं हो सकता है, लेकिन यदि आप 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) 
+0

दिलचस्प विचार! लैम्ब्डा को 'x [0] में बदलना! = "-"' को तर्कों को प्रभावी ढंग से विभाजित करने के लिए काम करना चाहिए (मुझे लगता है कि मूल वाक्यविन्यास मैं प्रस्तावित करता हूं कि इसे '-'' से शुरू होने वाले फ़ाइल नामों को स्वीकार करने के लिए अनुचित बनाता है)। मुझे इसके साथ खेलने दो। –

+0

@ बेनबैंक लैम्ब्डा को 'x.startswith (' - ') में बदलना नहीं था, मेरा पहला विचार भी था, लेकिन यह आपके परीक्षण उदाहरण में विफल रहता है क्योंकि' 1 '' – mgilson

+0

'से शुरू नहीं होता है, इसके आसपास मैं इसे बदलता हूं [बदले में लैम्ब्डा] (https://gist.github.com/3026853) हार्ड-कोडेड तर्क के साथ जो नामित पैरामीटर के बाद विभाजित करने से इंकार कर देता है। उस परिवर्तन के साथ, यह वही कर रहा है जो मुझे चाहिए! सहायता के लिए धन्यवाद। –

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