में पेश किया गया है क्या पाइथन में सी # null-conditional operator के बराबर है?पाइथन के नल-सशर्त ऑपरेटर के बराबर सी # 6
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
में पेश किया गया है क्या पाइथन में सी # null-conditional operator के बराबर है?पाइथन के नल-सशर्त ऑपरेटर के बराबर सी # 6
System.Text.StringBuilder sb = null;
string s = sb?.ToString(); // No error
के बारे में कैसे:
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'>
खैर, सबसे सरल समाधान होगा:
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')()
यहाँ, व्यापार बंद, समारोह भूमि के ऊपर बुला, लेकिन बहुत साफ कोड है खासकर यदि आप इसे कई बार उपयोग कर रहे हैं।
धन्यवाद, मैं इस विधि के बारे में पता कर रहा हूँ, लेकिन उम्मीद थी कि ऐसा करने के लिए एक छोटा रास्ता है कि वहाँ है। –
दुर्भाग्यवश, ऐसा नहीं है। हालांकि, अगर आप ओवरहेड पर ध्यान नहीं देते हैं, तो आप इसे एक फ़ंक्शन में लपेट सकते हैं। – Tanmay
मुझे लगता है कि इस उत्तर में उदाहरण के लिए कुछ संशोधन की आवश्यकता है क्योंकि इसे अतिरिक्त संदर्भ की आवश्यकता है - पायथन में 'ToString' विधि अंतर्निहित नहीं है; हमें 'temp = sb' के साथ अतिरिक्त कदम क्यों चाहिए? –
मैं अपने आवश्यक व्यवहार के साथ इस समारोह में लिखा था। चेनिंग 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
धन्यवाद, अगर कुछ और नहीं आता है तो मैं थोड़ी देर के बाद इस जवाब को स्वीकार करूंगा। –
यह समाधान अप्रत्याशित परिणाम देता है यदि एसबी 'none' नहीं बल्कि एक झूठा है। उदाहरण के लिए यदि 'sb =" "' है तो यह '" विधि "के बजाय' "" देता है – Tanmay