2012-12-31 17 views
20
में एक्स बाकी y` बयान

मैं काफी पायथन के त्रिगुट ऑपरेटर दृष्टिकोण से परिचित हूँ: पूर्व कार्य बिना संदर्भ के लिए अवधि जा रहा है वहाँ वैसे भी है:को संपीड़ित `एक्स अगर अजगर

value = foo if something else bar 

मेरा प्रश्न बहुत सरल है रिटर्न ऑपरेंड (... if या else ...) में से एक (if ...) में मूल्यांकन किया गया है?

यहां प्रेरणा यह है कि कभी-कभी मैं if ... में अभिव्यक्तियों का उपयोग करता हूं जो कि टर्नरी ऑपरेशन के परिणामस्वरूप मैं वही करना चाहता हूं; हालांकि, छोटे अभिव्यक्तियों के लिए, इसे दोहराने में कोई समस्या नहीं है, लेकिन थोड़ी देर के लिए अभिव्यक्ति के लिए, यह कुछ हद तक बुरा हो जाता है। इसे एक उदाहरण के रूप में लें:

value = info.findNext("b") if info.findNext("b") else "Oompa Loompa" 
+0

अच्छी तरह से, ओम्पा लूमपा मजाकिया है! –

+0

@AspiringAqib हमारे पास असाइनमेंट नहीं है, लेकिन हम अभी भी कुछ oompa loompas का आनंद ले सकते हैं ( – Rubens

+0

अच्छी तरह से, आपको वहां समाधान मिला है? –

उत्तर

23

ऐसा करने का कोई तरीका नहीं है, और यह जानबूझकर है। टर्नरी अगर केवल मामूली मामलों के लिए इस्तेमाल किया जाना चाहिए।

आप दो बार एक गणना के परिणाम का उपयोग करना चाहते हैं, तो यह एक अस्थायी चर में डाल:

value = info.findNext("b") 
value = value if value else "Oompa Loompa" 

एक बार जब आप ऐसा करते हैं, यह स्पष्ट हो जाता है कि आप कुछ मूर्खतापूर्ण कार्य कर रहे हैं, और वास्तव में इस लिखने के लिए pythonic तरीका है:

value = info.findNext("b") 
if not value: 
    value = "Oompa Loompa" 

और वह वास्तव में 5 कम अपने मूल प्रयास से कीस्ट्रोक्स है।

तुम सच में कीस्ट्रोक्स सहेजना चाहते हैं, तो आप के बजाय यह कर सकते हैं:

value = info.findNext("b") or "Oompa Loompa" 

लेकिन उस BDFL द्वारा कई शैली गाइड द्वारा हतोत्साहित है, और।

यदि आप केवल एक बार ऐसा कर रहे हैं, तो यह अधिक स्पष्ट होना बेहतर है। आप इसे आधा दर्जन बार कर रहे हैं, यह findNext एक वैकल्पिक डिफ़ॉल्ट ले None के बजाय वापस जाने के लिए बनाने के लिए बेहतर तुच्छ-और भी बहुत कुछ है, बस की तरह उन सभी में निर्मित और stdlib कार्य:

def findNext(self, needle, defvalue=None): 
    # same code as before, but instead of return None or falling off the end, 
    # just return defvalue. 

फिर आप यह कर सकते हैं:

value = info.findNext("b", "Oompa Loompa") 
+0

मुझे वास्तव में प्रोग्रामिंग के साथ कुछ उत्सुकताएं हैं: मुझे 70 से अधिक कॉलम लिखना पसंद नहीं है, और मैं वास्तव में एक-पंक्ति समाधान की सराहना करता हूं; यहां की समस्या स्पष्ट शब्दों की तुलना में कॉम्पैक्टनेस के बारे में है। मैं आपका जवाब स्वीकार कर रहा हूं, हालांकि, जैसा कि आप मेरे द्विआधारी प्रश्न के लिए 'हां/नहीं' का जवाब दे रहे हैं। सहमत हैं, फिर भी, कि @Ignacio द्वारा इंगित या उपयोग करने के बाद, सबसे अच्छा समाधान है। – Rubens

+0

लौटने ''कोई नहीं' 'शून्य' लौटने जैसा ही है, और इसलिए [बस इतना बुरा] (http://en.wikipedia.org/wiki/Void_safety)। –

+1

@ रूबेन्स: 1-लाइन समाधान लिखने का पाइथोनिक तरीका एक स्पष्ट कार्य में जटिल कुछ भी लपेटना है। यदि आप 'findNext' में 'defval' जोड़ सकते हैं, तो ऐसा करें; यदि आप नहीं कर सकते हैं, तो एक रैपर लिखें। विभिन्न भाषाओं में अलग-अलग बेवकूफ शैलियों हैं (उदाहरण के लिए, हास्केल में, एक फ़ंक्शन नामकरण जिसे आप केवल कॉल करने के लिए कॉल कर रहे हैं कोड गंध है), और विभिन्न भाषाएं उनके मुहावरों का अधिक दृढ़ता से पालन करती हैं (उदाहरण के लिए, पेर्ल में, "ऐसा करने का केवल एक ही तरीका है यह "एक बग माना जाएगा, एक सुविधा नहीं)। लेकिन अगर आपने पायथन चुना है, तो आपको बेवकूफ पायथन सीखना चाहिए। – abarnert

20

if ... else का उपयोग न करें। इसके बजाय, पायथन के कोलेसिंग ऑपरेटरों का लाभ उठाएं।

value = info.findNext("b") or "Oompa Loompa" 
+1

यह [निश्चित रूप से एक शॉर्टकट] है (http: // docs।python.org/2/library/stdtypes.html#boolean-operations-and-or-not), @ रूबेन्स। 'x या y' को उसी कोड में संकलित करना चाहिए जैसे 'bool (x) फिर x else y'। 'बूल' कॉल '.__ nonzero __()'। –

+1

आप इसे _can_ करते हैं, लेकिन इसका मतलब यह नहीं है कि आप _should_। यदि आप यह पर्याप्त समय कर रहे हैं जो 5 कीस्ट्रोक मामलों को सहेजता है, तो डिफ़ॉल्ट मान लेने के लिए 'findNext' विधि को संशोधित करें। अन्यथा, इसे स्पष्ट रूप से लिखें। – abarnert

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