2015-12-30 3 views
8

स्विफ्ट में मैं var?.prop कर सकता हूं। इसके परिणामस्वरूप nilvarnil है, अन्यथा यह var की संपत्ति के मूल्य में परिणाम देता है।स्विफ्ट विकल्प (या हास्केल की शायद)?

तुल्य, मैं जो मुझे देता है None, और यह मुझे var अंदर मूल्य (Just में लिपटे) के लिए आवेदन करने की prop मूल्य देता है varNone है हास्केल में var >>= prop कर सकते हैं।

क्या पाइथन में समतुल्य है?

+1

भ्रमित शीर्षक और टैग। – Snusmumrikken

+0

आप एक सशर्त अभिव्यक्ति का उपयोग कर सकते हैं: 'var.prop अगर var else var' लेकिन सामान्य रूप से अजगर में आपको यह जानने की उम्मीद है कि कुछ कब नहीं है और जब यह नहीं है और पूछता नहीं है। –

+5

@Snusmumrikken वास्तव में नहीं, यह वास्तव में स्पष्ट है, आपको इसे समझने में सक्षम होने के लिए स्विफ्ट या हास्केल की अवधारणाओं को समझने की आवश्यकता है – Zizouz212

उत्तर

3

अन्य उत्तर एक सशर्त अभिव्यक्ति का सुझाव देने में सही रास्ते पर हैं, लेकिन इसे कैसे करें इसके बारे में गलत है।

None if var is None else var.prop 

या, समतुल्य रूप

var.prop if var is not None else None 

वहाँ अजगर को एक ऐसी विशेषता जोड़ने के बारे में एक draft PEP है, और वहाँ अजगर-विचारों की मेलिंग सूची पर इसके बारे में चर्चा की गई है: आप इसे इस तरह से कर सकते हैं । ऐसा लगता है कि यह निकट भविष्य में (यदि कभी भी) में जोड़ा जाएगा, लेकिन पीईपी पढ़ने से आपको इसे संभालने के कुछ मौजूदा और प्रस्तावित तरीकों का विचार मिलेगा।

+0

"अन्य उत्तर एक सशर्त अभिव्यक्ति का सुझाव देने में सही रास्ते पर हैं, लेकिन यह कैसे करना है इसके बारे में गलत है। आप इसे इस तरह से कर सकते हैं" - मेरा अनौपचारिक गलत कैसे है यदि यह आपके जैसा है? –

+0

@ एलीकोर्विगो: जब मैंने इसे लिखना शुरू किया था तो आपका जवाब गलत था, लेकिन फिर आपने इसे संपादित किया। – BrenBarn

2

लंबी कहानी कम, वहाँ कोई विशेष सिंटेक्स optionals को संभालने के लिए है (के बाद से वहाँ कोई optionals कर रहे हैं), हालांकि आप सशर्त असाइनमेंट (त्रिगुट ऑपरेटर) का उपयोग कर सकते कार्यक्षमता नकल करने के लिए:

unpacked_var = var.prop if var is not None else None 

अजगर मैं में हालांकि यह जांच लेंगे कि var में वह विशेषता है जिसे आप एक्सेस करना चाहते हैं।

unpacked_var = var.prop if hasattr(var, "prop") else None 

आप बनाने के लिए एक समारोह में लिख सकते हैं इसे कम

def optional(var, attr): 
    return getattr(var, attr) if hasattr(var, attr) else None 

unpacked_var = optional(var, "prop") 

इस (और कम स्पष्ट है, IMHO) करने के लिए एक कम सार्वभौमिक तरीका नहीं है:

unpacked_var = hasattr(var, "prop") and var.prop or None 

समस्या यहाँ यह है कि आपको None मिलेगा यदि bool(var.prop) == False, तो आप बेहतर ऊपर टर्नरी ऑपरेटर से चिपके रहेंगे।

+1

ठीक है, बिल्कुल नहीं। यदि 'var' कभी-कभी' प्रोप 'और कभी-कभी' कोई नहीं 'वाला ऑब्जेक्ट होता है, तो यह एक वैकल्पिक वैकल्पिक के समान ही होता है। इस दृश्य में पायथन का 'var.prop' स्विफ्ट में' var! .prop' जैसा ही है: यदि 'var' 'none' है तो यह फेंक देगा। फिर, 'var'' प्रोप 'के बिना कुछ अन्य ऑब्जेक्ट भी हो सकता है: स्विफ्ट इसे "प्रोटोकॉल को कार्यान्वित नहीं कर रहा है" कहता है, इसलिए एक और सटीक अनुवाद' (var! As! HavingProp) .prop' जैसा कुछ है।और फिर मुख्य अंतर यह है कि स्विफ्ट इस तरह के प्रत्येक धारणा को विस्मयादिबोधक चिह्न के साथ स्पष्ट करता है। –

+7

"पायथन में गतिशील टाइपिंग इसे छोटा बनाता है" - जब से '।?' की तुलना में एक इनलाइन सशर्त मामूली कब है? – Ryan

+1

आईएमओ, आपको राय बिट को हटा देना चाहिए - यह चर्चा करने की जगह नहीं है कि कौन सी भाषा संरचनाएं "अजीब" हैं और कौन से "तुच्छ" हैं। अन्यथा, यह एक अच्छा जवाब है - मुझे लगता है कि आप विभिन्न विकल्पों का पता लगाते हैं। (हालांकि, वास्तव में संक्षिप्त उत्तर यह है: "नहीं। ऐसा कोई वाक्यविन्यास नहीं है।") – skagedal

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