2012-01-30 17 views
5

संभव डुप्लिकेट: इस तरह के एक सरल प्रश्न के लिए
Python conditional assignment operatorअजगर बराबर =

क्षमा याचना, लेकिन googling ||= बहुत उपयोगी नहीं है,)

क्या पाइथन में ||= कथन के बराबर है जो रूबी और पर्ल में मौजूद है?

foo = "hey" 
foo ||= "what" # assign foo if it's undefined 
# foo is still "hey" 

bar ||= "yeah" 
# bar is "yeah" 

भी कुछ इस तरह के लिए सामान्य शब्द है:

उदाहरण के लिए

? सशर्त असाइनमेंट मेरा पहला अनुमान था लेकिन Wikipedia page मेरे मन में काफी कुछ नहीं था।

+0

हां यह ऐसा लगता है कि यह एक डुप्लिकेट है। धन्यवाद एडम! –

+2

'$ foo || =" क्या "' 'foo' को फिर से सौंपेगा यदि यह पहले से ही * झूठा * है। बेशक 'undef' गलत है, लेकिन फिर शून्य और शून्य स्ट्रिंग है। इसके बजाए केवल एक अपरिभाषित मूल्य उपयोग स्लैश को पुन: असाइन करने के लिए, '$ foo // = "क्या" ' – Borodin

+0

नोट करें कि' // '(और उसका एक्सटेंशन,' // = ') perl 5.10 में जोड़ा गया था। यदि आप अभी भी 5.8.x पर फंस गए हैं, तो आप '// =' का उपयोग करने में सक्षम नहीं होंगे (और यदि आपको संभव हो तो आपको गंभीरता से उन्नयन पर विचार करना चाहिए)। –

उत्तर

6

एक बालक थोड़ा और अधिक वर्बोज़, लेकिन सबसे आसान

foo = "hey" 
foo = foo or "what" 
#foo is still "hey" 

bar = None 
bar = bar or "yeah" 
#bar is "yeah" 

तुम भी त्रिगुट ऑपरेटर का उपयोग कर सकते

bar = None 
bar = bar if bar else "yeah" 

हालांकि, अगर मैं तुम्हें समझ में है, ||= चर है कि पहले नहीं थे प्रदान करती है शिकायत के बिना परिभाषित? मुझे पता नहीं था।

ऐसा करने के लिए है कि स्थानीय क्षेत्र में, इस बदसूरत बतख का बच्चा काम कर सकता था

bar = locals()['bar'] if 'bar' in locals() else 'yeah' 

संपादित करें:

बस डुप्लिकेट को देखा, और यह समाधान के बहुत सारे भी है :) बहुत आलसी उन लोगों के लिए देखो, वे भी पर एक अच्छे संस्करण शामिल हैं मेरी पिछले एक

foo = foo if 'foo' in locals() else 'hey' 

लेकिन इस अपरिभाषित चर के लिए काम नहीं करेगा, केवल falsy मूल्यों की जगह और अपरिभाषित एकबढ़ा देंगे हो जाएगा। यह अगले एक, OTOH, केवल अपरिभाषित के लिए काम करेंगे और हमेशा एक ही पहले से मौजूद falsy मूल्य, के रूप में @Borodin कहते हैं जो निश्चित रूप से पर्ल

foo = locals().get('foo','hey') 

में //= की तरह है और, रखने के लिए, किसी को एक अपवाद :(

इस्तेमाल किया ।
try: 
    v 
except NameError: 
    v = 'bla bla' 
+0

नहीं, '|| =' एक चर को पुन: असाइन करेगा यदि यह 'झूठा' है। प्रश्न पर मेरी टिप्पणी देखें। आप शिकायत की अपेक्षा क्यों करेंगे? – Borodin

+0

उत्तर के लिए धन्यवाद, सबसे पहले मैंने उल्लेखनीय अंतर नहीं देखा। काम करने के लिए 'bar = none' की आवश्यकता है, अन्यथा यह' NameError' फेंकता है। समान व्यवहार के लिए आपको अपने 'स्थानीय() [' बार ']' स्निपेट की आवश्यकता है। धन्यवाद फिर से :) –

+0

@borodin मैं रूबीस्ट नहीं हूं, मैंने इसे केवल शेफ जैसे मूर्ख सामानों के लिए उपयोग किया है। मेरा मतलब था कि मुझे नहीं पता था कि रूबी में 'अपरिफ' झूठा था, क्योंकि यह पायथन में अनिश्चित संदर्भ नहीं है (अपरिभाषित संदर्भ अपवाद फेंकते हैं)।भले ही, आपकी टिप्पणियों के लिए धन्यवाद, मैंने कुछ सीखा :) –

1

नाम के बारे में सुनिश्चित नहीं हैं कि सबसे अच्छा मैं के साथ आ सकता है: अजगर में

>>> a = 'foo' 
>>> a = 'a' in locals() and a or 'what' 
>>> a 
'foo' 
>>> b = 'b' in locals() and b or 'yeah' 
>>> b 
'yeah' 
2

आप शायद ही कभी अपरिभाषित होगा चर, और यह आमतौर पर मतलब है कि आप मीटर है जब आप ऐसा करेंगे एक गलती का पालन करें।हालांकि, आसानी से, अधिकांश प्रकार के मान जिन्हें सामान्य रूप से डिफ़ॉल्ट (खाली कंटेनर, शून्य-लंबाई तार, शून्य, और) के रूप में उपयोग किया जाता है, वे पाइथन में "झूठी" हैं, इसलिए आप कभी-कभी इस तरह की चीजें देखते हैं जो इसका लाभ उठाते हैं अजगर में बूलियन ऑपरेटरों काम:

name = name or "Guido" # if name is empty, set it to "Guido" 
numb = numb or 42  # if numb is zero, set it to 42 

कारण यह काम करता है अजगर बंद हो जाता है कि or का मूल्यांकन करता है, तो पहला तर्क "truthy," जो छोटे-सर्किटिंग कहा जाता है, और दोनों ही मामलों में वास्तविक तर्क देता है, बजाय है इसके परिणामस्वरूप केवल True या False। तो यदि name "जिम" है तो "Jim" or "Guido""Jim" का मूल्यांकन करता है क्योंकि "Jim" गैर-शून्य-लंबाई वाली स्ट्रिंग है और इसलिए "सत्य" है।

बेशक, यह तब तक अच्छा काम नहीं करता है जब आप यह नहीं जानते कि आप किस प्रकार के मूल्य से निपट रहे हैं और/या "गलत" मान मान्य मान है।

name = raw_input("What is your name? ") or "Guido" 

एक अन्य आम मुहावरा है जब एक शब्दकोश में आइटम के साथ काम कर प्रयोग किया जाता है: हालांकि, यह विन्यास फाइल और raw_input() तरह बातें जहां एक लापता मूल्य एक खाली स्ट्रिंग वापस आ जाएगी साथ बहुत अच्छी तरह से काम करता है। शब्दकोश वर्ग की get() विधि आपको चर का उपयोग करने के लिए डिफ़ॉल्ट मान निर्दिष्ट करने देता है यदि चर शब्दकोश में नहीं है।

name = values.get("name", "Guido") 

यह जब अपने समारोह **kwargs परंपरा का उपयोग करके कीवर्ड तर्क पारित किया गया है इस्तेमाल किया जा सकता। आप भी यह चर के साथ इस्तेमाल कर सकते हैं, के रूप में globals() और locals() कार्यों एक शब्दकोश के रूप में क्षेत्र में वर्तमान में, लौट क्रमशः, सभी वैश्विक या स्थानीय चर:

name = locals().get("name", "Guido") 

लेकिन, जैसा कि मैंने कहा, आप शायद ही कभी होगा पाइथन में वास्तव में अपरिभाषित चर। वेब ढांचे जैसे मामलों में, आपको एक शब्दकोष के रूप में क्वेरी स्ट्रिंग तर्क पारित किया जाएगा, उदाहरण के लिए, और शब्दकोश पर .get() विधि का उपयोग कर सकते हैं।

दुर्लभ मामले में जहां एक नाम वास्तव में मौजूद नहीं है (उदाहरण के लिए, आपकी कॉन्फ़िगरेशन फ़ाइल पायथन सिंटैक्स में है और आप इसे पार्सिंग मॉड्यूल के रूप में आयात कर रहे हैं, और आप चाहते हैं कि उपयोगकर्ता इसे छोड़ने में सक्षम हों कुछ मान ... या कुछ और समान रूप से निराला) तो आप getattr() उपयोग कर सकते हैं, जो (शब्दकोश की .get()) की तरह एक डिफ़ॉल्ट मान स्वीकार करता है:

import config 
name = getattr(config, "name", "Guido") # rather than just name.config 

या बस यह एक NameError फेंक और इसे पकड़ कर सकते हैं।

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