2013-11-28 11 views
6

क्या मैं एक स्ट्रिंग को पायथन में तर्क सूची में परिवर्तित कर सकता हूं?पायथन एक स्ट्रिंग को तर्क सूची में परिवर्तित करें

def func(**args): 
    for a in args: 
     print a, args[a] 

func(a=2, b=3) 

# I want the following work like above code 
s='a=2, b=3' 
func(s) 

मुझे पता है:

सूची, बस * सूची का उपयोग कर सकते हैं, लेकिन सूची की तरह एक तत्व नहीं हो सकता है: एक = 2 ​​

और eval केवल अभिव्यक्ति का मूल्यांकन कर सकते

जो होगा जैसे:

def func2(*args): 
    for a in args: 
     print a 

list1=[1,2,3] 
func2(*list1) 
func2(*eval('1,2,3')) 
+0

कुछ [argparse] (http://docs.python.org/dev/library/argparse.html#argparse.ArgumentParser.parse_args) जैसा कुछ करना चाहिए। तर्कों के साथ 'parse_args()' को कॉल करने का तरीका देखें। –

उत्तर

8

आप इनपुट स्ट्रिंग को एक शब्दकोश में मालिश कर सकते हैं और उसके बाद अपने फ़ंक्शन को कॉल कर सकते हैं, उदा।

>>> x='a=2, b=3' 
>>> args = dict(e.split('=') for e in x.split(', ')) 
>>> f(**args) 
a 2 
b 3 
+0

पहले इस वाक्यविन्यास को देखा। धन्यवाद। मुझे नहीं पता कि x.split (',') में ई के लिए tuple (e.split ('=')) क्यों वाक्यविन्यास त्रुटि का कारण बनता है, क्या यह dict() का तर्क नहीं है? क्या इस नियम के बारे में कोई व्याख्या है? –

+0

@AylwynLake: यह एक [जेनरेटर अभिव्यक्ति] है (http://www.python.org/dev/peps/pep-0289/) जो बदले में [सूची समझ] का एक सामान्यीकृत रूप है (http: // docs। python.org/2/tutorial/datastructures.html#list-comprehensions)। –

7

आप एक शब्दकोश चाहते, एक 'तर्क सूची' नहीं। तुम भी बेहतर होगा सिर्फ अजगर शाब्दिक मूल्यांकन करने के लिए ast.literal_eval() का उपयोग कर होगा:

from ast import literal_eval 

params = "{'a': 2, 'b': 3}" 
func(**literal_eval(params)) 

इससे पहले कि आप यह तरीका अपनाते हैं, सुनिश्चित करें कि आप पहले विकल्प वास्ते के लिए अन्य विकल्पों का पता लगाया है बनाने के लिए, इस तरह के कमांड लाइन विकल्प के लिए argparse के रूप में , या नेटवर्क या फ़ाइल-आधारित स्थानांतरण या दृढ़ता के लिए JSON।

+1

+1 लेकिन यह समाधान लागू नहीं हो सकता है यदि 'a = 2, b = 3' स्ट्रिंग उपयोगकर्ता इनपुट है (उदा। कॉन्फ़िगरेशन फ़ाइल या इसी तरह से); आप मनमाने ढंग से पायथन कोड का मूल्यांकन करने की अनुमति नहीं देंगे। : -} –

+0

@ फ्रैरिचराबे: ओपी 'तर्क "(1, 2, 3)" 'और' func2 (* literal_eval (args)) के बराबर की तलाश में लग रहा था; जैसे कुछ ऐसा जो कॉल पर लागू करने के लिए सही पायथन संरचना का उत्पादन करेगा। –

+0

@MartijnPieters: मेरा मतलब है फ्रैरिक राबे ने कहा। मैं तालिकाओं की कॉन्फ़िगरेशन फ़ाइल से पढ़ना चाहता हूं, फिर स्वत: जेनरेट करने के लिए sqlalchemy का उपयोग करें। कॉलम ('id', Integer, primary_key = True) को संसाधित करते समय। फिर इस सवाल से पूछो। –

0

आप eval, उदा करने के लिए एक कॉल में सीधे एक तर्क सूची के रूप में उपयोग कर सकते हैं स्ट्रिंग

def func(**args): 
for a in args: 
    print(a, args[a]) 

s='a=2, b=3' 

eval('func(' + s + ')') 
>>>b 3 
>>>a 2 

टिप्पणी eval कॉल इस तरह काम करने के लिए है कि func जरूरतों नाम स्थान में किया जाना है।

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

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