2016-07-09 6 views

उत्तर

4

के बारे में कैसे:

s = sb and sb.ToString() 

लघु सर्किट बूलियन करना बंद कर दे sb, Falsy है किसी और अगले अभिव्यक्ति देता है।

Btw, अगर कोई भी हो रही महत्वपूर्ण है ...

sb = "" 

#we wont proceed to sb.toString, but the OR will return None here... 
s = (sb or None) and sb.toString() 

print s, type(s) 

उत्पादन:

None <type 'NoneType'> 
+0

धन्यवाद, अगर कुछ और नहीं आता है तो मैं थोड़ी देर के बाद इस जवाब को स्वीकार करूंगा। –

+0

यह समाधान अप्रत्याशित परिणाम देता है यदि एसबी 'none' नहीं बल्कि एक झूठा है। उदाहरण के लिए यदि 'sb =" "' है तो यह '" विधि "के बजाय' "" देता है – Tanmay

4

खैर, सबसे सरल समाधान होगा:

result = None if obj is None else obj.method() 

लेकिन अगर आप सी # के अशक्त-सशर्त ऑपरेटर के रूप में एक ही धागा सुरक्षा होने सटीक बराबर करना चाहते हैं, यह होगा:

obj = 'hello' 
temp = obj 
result = None if temp is None else temp.split() 

व्यापार बंद यह है कि कोड वास्तव में सुंदर नहीं है; नामस्थान में अतिरिक्त नाम temp भी जोड़ा जाता है।

एक और तरीका है:

def getattr_safe(obj, attr): 
    return None if obj is None else getattr(obj,attr) 

obj = 'hello' 
result = getattr_safe(obj,'split')() 

यहाँ, व्यापार बंद, समारोह भूमि के ऊपर बुला, लेकिन बहुत साफ कोड है खासकर यदि आप इसे कई बार उपयोग कर रहे हैं।

+2

धन्यवाद, मैं इस विधि के बारे में पता कर रहा हूँ, लेकिन उम्मीद थी कि ऐसा करने के लिए एक छोटा रास्ता है कि वहाँ है। –

+0

दुर्भाग्यवश, ऐसा नहीं है। हालांकि, अगर आप ओवरहेड पर ध्यान नहीं देते हैं, तो आप इसे एक फ़ंक्शन में लपेट सकते हैं। – Tanmay

+0

मुझे लगता है कि इस उत्तर में उदाहरण के लिए कुछ संशोधन की आवश्यकता है क्योंकि इसे अतिरिक्त संदर्भ की आवश्यकता है - पायथन में 'ToString' विधि अंतर्निहित नहीं है; हमें 'temp = sb' के साथ अतिरिक्त कदम क्यों चाहिए? –

0

मैं अपने आवश्यक व्यवहार के साथ इस समारोह में लिखा था। चेनिंग and पर इसका लाभ यह है कि लंबी श्रृंखलाओं की बात होने पर लिखना आसान होता है। यह ऊपर है ऑब्जेक्ट कुंजी, केवल विशेषताओं के साथ काम नहीं करता है।

def null_conditional(start, *chain): 
    current = start 
    for c in chain: 
     current = getattr(current, c, None) 
     if current is None: 
      break 
    return current 

यहाँ कुछ परीक्षण मैं इतना दौड़ा आप देख सकते हैं कि यह कैसे काम करता है

class A(object): 
    b = None 
    def __init__(self, v): 
     self.b = v 

class B(object): 
    c = None 
    def __init__(self, v): 
     self.c = v  

a_1 = A(B(2)) 
a_2 = A(None) 
print(null_conditional(a_1, 'b', 'c')) # 2 
print(null_conditional(a_1, 'b', 'd')) # None 
print(null_conditional(a_2, 'b', 'c')) # None 
print(null_conditional(None, 'b')) # None 
print(null_conditional(None, None)) # TypeError: attribute name must be string 
संबंधित मुद्दे