2010-12-05 3 views
15

में किसी शब्दकोश से चर बनाने या असाइन करने के लिए मैंने सामान्य रूप से यहां एक बार एक प्रश्न पूछने की कोशिश की लेकिन कोई भी जो मैं पूछना चाहता हूं उसे समझने की कोशिश नहीं की। तो मुझे PHP में उदाहरण मिला है।पायथन

// $_POST = array('address' => '123', 'name' => 'John Doe'); 
extract($_POST); 
echo $address; 
echo $name 

क्या Python में निकालने() जैसे फ़ंक्शन है ?????

mydict = {'raw':'data', 'code': 500} 
// some magic to extract raw and code as vars 
print raw 

पश्चलेख:

तो एक ही शब्दकोश में चला जाता है मैं ऐसा क्यों करना चाहता हूं: जब आप कक्षा विधि में होते हैं, तब स्ट्रिंग के साथ 6 मैनिपुलेशन होना मुश्किल होता है() और प्रारूप() जब स्ट्रिंग self.data ['raw'] ['code'] (मान लीजिए) यह

+5

शीर्षक में व्यक्त प्रश्न बहुत भ्रामक है। "शब्दकोश को स्ट्रिंग में कनवर्ट करें" लगता है जैसे आप शब्दकोश को क्रमबद्ध करना चाहते हैं (उदाहरण के लिए अचार या जेसन के साथ) या इसे प्रिंट-प्रिंट करें (पीप्रिंट)। "एक शब्दकोश से चर बनाने या असाइन करना" इच्छित प्रश्न के करीब हो सकता है। –

उत्तर

4

ठीक php भाइयों इसलिए यहाँ एक बुरी खबर है, अजगर चर नहीं बना सकते अंतरिक्ष से बाहर ... जैसे php कर सकते हैं: $ {$ var}। स्थानीय() का उपयोग करने के लिए एक बहुत बुरा विचार है, क्योंकि आपको डिबगिंग के साथ कई समस्याएं मिलेंगी, और वहां कुछ स्थानीय लोग पहले से ही परिभाषित हैं .. इसलिए यह वास्तव में खराब काम है ...

आप नहीं कर सकते php करता है जैसे प्रोग्रामेटिक रूप से बनाएँ। मुझे लगता है कि इसे गैर-स्पष्टीकरण कहा जाता है, और यह एक पायथन सामान्य है: आप ALWAYS परिवर्तनीय नाम जानते हैं। कुछ मामलों में इस तरह की चीजें सिर्फ एक आत्महत्या है, आपको हाथों के हाथों से लिखने की ज़रूरत है ... अधिकतर मैं एक्सएमएल पार्सिंग जैसी चीज़ों से नाखुश था, लेकिन ऐसा लगता है कि पाइथन शब्दकोश को कक्षा में बदलने के तरीके हैं I इस कल के बारे में बताया गया था, लेकिन अभी भी चेक नहीं किया गया है कि कैसे यह खेल के लिए (here की तरह कुछ)

+1

वर्तमान नामस्थान में चर के अस्तित्व के अधिक अंतर्निहित, कोड की अधिक समस्याएं हो सकती हैं और स्केल नहीं कर सकती हैं। यह ग्लोबल्स के खिलाफ एक बड़ा तर्क है। वही इस मामले पर लागू होता है। आप कई परिवर्तनीय रूप से बनाए गए नहीं चाहते हैं, यह दृष्टिकोण एक अंतिम उपाय है, जो कम से कम हैम्पर्स पठनीयता, सीएफ [पायथन के जेन] (http://www.python.org/dev/peps/pep-0020 /)। –

+0

और अब मैं 100% आपसे सहमत हूं। लंबे समय से पहले PHP से माइग्रेट किया गया - और मैं इसके बारे में बेहद खुश हूं। – holms

25

आप स्थानीय प्रतीक तालिका को एक्सेस और उस तालिका अद्यतन करने के लिए locals() समारोह का उपयोग कर सकते यहाँ में dict) में dict है:,

>>> mydict = {'raw': 'data', 'code': 500} 
>>> locals().update(mydict) 
>>> raw 
'data' 
>>> code 
500 

प्रतीक तालिका कि जिस तरह से काफी असामान्य है संशोधित करना हालांकि, और शायद नहीं जाने का रास्ता। शायद आपको अपना डिज़ाइन बदलना होगा ताकि आप वास्तविक चर के बजाय mydict शब्दकोश का उपयोग कर सकें।

+0

मैं इस विधि के लिए कोड की एक पंक्ति में "डिज़ाइन को बदलना" चाहता हूं, उस शापित शब्दकोश को निकालने के द्वारा, मैं हर समय इस तरह php में कर रहा था .. – holms

+1

+1 एक असामान्य, गैर-मूर्खतापूर्ण चीज़ के लिए आप कर सकते हैं पायथन के साथ करो, लेकिन शायद नहीं करना चाहिए। – Zeke

+0

@holms, हो सकता है कि आप 'self.data [' कच्चे '] को कैश कर सकें, कहें, एक चर' डी' और इसके बजाय उस चर का उपयोग करें? यह छोटा होगा: 'd ['code']' self.data ['raw'] ['code'] 'के बजाय ''। –

1

मैं उन चरों को पकड़ने के लिए कक्षा बनाने की अनुशंसा करता हूं जिन्हें आप बनाने की कोशिश कर रहे हैं। एलेक्स मार्टेलि के प्रसिद्ध bunch recipe आपको स्थानीय सिग्नल टेबल को संशोधित करने के बिना लगभग सभी सुविधा प्राप्त करेंगे, जो docs विशेष रूप से करने के खिलाफ चेतावनी देते हैं)।

1

कुछ भी नहीं है वास्तव में नई यहाँ, सिर्फ एक anwser के समेकन और क्या @ जॉन वाई his answer में मतलब का एक उदाहरण:

mydict = {'raw': 'data', 'code': 500} 

def extract(dct, namespace=None): 
    if not namespace: namespace = globals() 
    namespace.update(dct) 

extract(mydict) 
print raw 
print code 

class Extract: 
    def __init__(self, dct): 
     self.__dict__.update(dct) 

obj = Extract(mydict) 
print obj.raw 
print obj.code 
10

बुरी देर से काम करता है, लेकिन मैं वास्तव में इस की जरूरत है, और मेरे समाधान किया गया था:

mydict = {'raw':'data', 'code': 500} 
raw, code = [mydict.get(k) for k in ['raw','code']] 

इस तरह यह है पढ़ने के लिए स्पष्ट और स्थानीय लोगों की कोई संभावित क्लोबिंग नहीं है() (जो एक जादू है जिसे मैं टालना चाहता हूं)।

+2

लेकिन यह गतिशील नहीं है, यानी, चर के नाम को रनटाइम पर गतिशील रूप से असाइन नहीं किया जा सकता है, या उनकी संख्या में परिवर्तन नहीं किया जा सकता है। –

+0

इस तरह की दूसरी पंक्ति के साथ भी बेहतर काम करता है: 'कच्चे, कोड = [mydict.get (k) mydict में k के लिए] ' –

0

आप लूप में exec कीवर्ड का भी उपयोग कर सकते हैं।

d = dict(param='hello', param2=500, param3=[1,2,3]) 
for k, v in d.iteritems(): 
    exec '%s = v' % k 

लेकिन यह निश्चित रूप से अवांछित लगता है। exec थोड़ा गूढ़ महसूस करता है और आपको शायद अपने कोड को पुन: व्यवस्थित करना चाहिए ताकि आपको ऐसा करने की आवश्यकता न हो।

0

मैंने @ फ्रेडेरिक हामिदी के जवाब की कोशिश की और पाया कि स्थानीय() केवल मुख्य लिपि में काम करता है और किसी भी कार्य में काम नहीं करता है। तो मैंने थोड़ा सा खोज किया, और पता लगाया कि स्थानीय() केवल पढ़ा जाता है। मुख्य लिपि में यह कारण काम करता है, संभवतः स्थानीय लोग() वहां ग्लोबल्स() के समान होते हैं, और ग्लोबल्स() को संशोधित किया जा सकता है।

तो मैं इसके बजाय globals() अद्यतन() का उपयोग करने का सुझाव दूंगा।

लेकिन यह आपके वैश्विक नामस्थान को प्रदूषित करने जा रहा है। तो यह चाल स्थानीय लोगों की तुलना में भी कम साफ है()।

+0

यह एक टिप्पणी के रूप में उपयुक्त हो सकता है, लेकिन यह वास्तव में प्रश्न का उत्तर नहीं देता है। कृपया तब तक प्रतीक्षा करें जब तक आपके पास टिप्पणी करने के लिए प्रतिनिधि न हो। – skrrgwasme

+0

@ScottLawson स्थानीय() उत्तर गलत है, क्योंकि यह केवल इंडेंटेशन के पहले स्तर में काम करता है, क्योंकि वह जगह है जहां स्थानीय() ग्लोबल्स() के समान हैं। अगर किसी को स्थानीय() अपडेट() के रूप में गंदे तरीके की आवश्यकता है, तो यह ग्लोबल्स() स्थानीय नहीं होना चाहिए()। मैं बस इतना कह रहा था। globals() अद्यतन() मूल प्रश्न का उत्तर है, और यह एक सही है। – liren

+0

मैं तुम्हारा बिंदु देखता हूं। मेरा डाउनवोट लॉक हो गया है जब तक कि आपका उत्तर संपादित न हो जाए। इसे एक त्वरित संपादन दें और मैं इसे हटा दूंगा। – skrrgwasme