2014-05-12 9 views
6

यह सुरक्षित है कि क्या एक चर myvar जाँच करने के लिए है न-कोई भी मूल्य बस से है: क्योंकि मैं एक चर राशिचेक अगर xml ElementTree नोड है कोई नहीं/गलत

if myvar: 
    print('Not None detected') 

मैं इस पूछ रहा हूँ और क्या जाँच की गई थी वेरिएबल None पर if variable: द्वारा परिवर्तनीय नहीं था लेकिन चेक असफल रहा है। चर में कुछ डेटा होता है लेकिन यह if चेक में गलत पर मूल्यांकन कर रहा था।

पूर्ण कोड:

from xml.etree import ElementTree as ElementTree 

root = ElementTree.fromstring('Some xml string') 

parameters = root.find('Some Tag') 

udh = parameters.find('UDH') 

if udh and udh.text: # In this line the check is failing, though the udh variable has value: <Element 'UDH' at 0x7ff614337208> 
    udh = udh.text 
    # Other code 
else: 
    print('No UDH!') # Getting this output 
+0

यह वास्तव में गलत है। '' अगर माईवर: '' '' ''मेरा मान'' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' ' हालांकि फॉर्म का उपयोग करने के लिए यह सबसे अच्छा अभ्यास है: '' यदि माईवर कोई नहीं है: '' या '' अगर मेरावारा कोई नहीं है: ' –

+0

यहां उत्तर दिया गया था: http://stackoverflow.com/questions/3965104/not-none -टेस्ट-इन-पायथन – ka2m

+0

क्या आपकी जांच विफल नहीं है क्योंकि उध में कोई टेक्स्ट नहीं है? यह एक खाली एक्सएमएल नोड हो सकता है। – Midnighter

उत्तर

5

पायथन में ऑब्जेक्ट का बूलियन (सत्य) मान None होने के बराबर नहीं है या नहीं। उस धारणा की शुद्धता इस बात पर निर्भर करती है कि क्या आपके ऑब्जेक्ट में सही तरीके से परिभाषित सही तरीके हैं। अजगर 2.7 के लिए के रूप में:

object.__nonzero__(self)

सच्चाई मूल्य परीक्षण और लागू करने के लिए कहा जाता है में निर्मित आपरेशन bool(); False या True, या उनके पूर्णांक समकक्ष 0 या 1 वापस करना चाहिए। जब यह विधि परिभाषित नहीं की जाती है, तो __len__() कहा जाता है, यदि इसे परिभाषित किया गया है, और ऑब्जेक्ट को सही माना जाता है यदि इसका परिणाम nonzero है। यदि कोई वर्ग न तो __len__() और न ही __nonzero__() परिभाषित करता है, तो इसके सभी उदाहरण सत्य मानते हैं। None तरह एकमात्र करने

तुलना हमेशा is या is not, कभी नहीं समानता ऑपरेटरों के साथ किया जाना चाहिए:

इसके अलावा पीईपी 8 पर एक नज़र, कि इस मुद्दे (जोर मेरा) के लिए मार्गदर्शन प्रदान किया है ।

इसके अलावा, if x लिखने से सावधान रहें जब आप वास्तव में if x is not None - उदा। परीक्षण करते समय कि कोई चर या तर्क जो None पर डिफ़ॉल्ट है, किसी अन्य मान पर सेट किया गया था। अन्य मूल्य में एक प्रकार (जैसे एक कंटेनर) हो सकता है जो एक बुलियन संदर्भ में गलत हो सकता है!

इसलिए, सुरक्षित रूप से परीक्षण करने के लिए आप None मिल गया है कि क्या है या not None आप विशेष रूप से उपयोग करना चाहिए: xml.etree.ElementTree.Element बूलियन मूल्यांकन के अर्थ विज्ञान के मामले में

if myvar is None: 
    pass 
elif myvar is not None: 
    pass 

None -नेस से अलग

0123: वस्तु की

संदर्भ के लिए:

+3

[पेप 8] (http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations) पर भी एक शब्द है: * इसके अलावा, लिखने से सावधान रहें 'यदि x'' जब आप वास्तव में मतलब है ''यदि x कोई नहीं है'' –

+1

@ जोनासविएलिकी उस संदर्भ के लिए धन्यवाद! – moooeeeep

+0

आपके उत्तर के लिए बहुत बहुत धन्यवाद। क्या आप बता सकते हैं कि पाइथन 3 में क्या होता है यह मूल्यांकन करने के लिए कि क्या चर द्वारा संदर्भित मूल्य बूलियन हो सकता है? – giga

2

ElementTree बच्चों के बिना नोड्स के लिए व्यवहार मानक अजगर अभ्यास से एक कुख्यात प्रस्थान है। आम तौर पर, यह केवल आपकी स्थिति में चर का उपयोग करने के लिए सुरक्षित होगा और मान लें कि बूलियन मान समझदार है। इस मामले में, जैसा कि आपने पहले हाथ का अनुभव किया है, आपको एक और स्पष्ट जांच करना होगा।

1

अपने मामले के लिए, यह अगर तत्व पाया गया है या नहीं के बाद से ElementTree returns False to the __nonzero__ testजाँच करने के लिए सुरक्षित है।

लेकिन, जैसा कि दस्तावेज़ का कहना है, यह बेहतर है कि आप केवल जाँच करना चाहते हैं, तो तत्व नहीं पाया गया है is None साथ स्पष्ट रूप से जाँच करने के लिए, यह है:

सावधानी: क्योंकि तत्व वस्तुओं एक परिभाषित नहीं करते nonzero() विधि, कोई सबलेमेंट वाले तत्व गलत के रूप में परीक्षण करेंगे।

element = root.find('foo') 

if not element: # careful! 
    print "element not found, or element has no subelements" 

if element is None: 
    print "element not found" 

अनुस्मारक के लिए, object.__nonzero__ मूल्य परीक्षण में और bool() आपरेशन में प्रयोग किया जाता है।

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