2014-05-12 59 views
6

是否安全,檢查是否變量myvar沒有-無值通過簡單:檢查XML ElementTree的節點是無/假

if myvar: 
    print('Not None detected') 

我問這是因爲我有一個變量,並檢查是否該變量不是None只需if variable:但該檢查失敗。該變量包含一些數據,但它在if檢查中評估爲False。

全碼:

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

這實際上是錯誤的。 ''如果myvar:''假設''myvar''爲''None''實際上不會評估爲''True'',因此您的示例將不起作用。不過最好的做法是使用如下形式:''如果myvar不是None:''或''如果myvar是None:'' –

+0

在這裏回答:http://stackoverflow.com/questions/3965104/not-none -python – ka2m

+0

是不是你的檢查失敗,因爲在udh中沒有文本?它可能是一個空的XML節點。 – Midnighter

回答

5

在Python中,對象的布爾值(真值)不一定等於None。該假設的正確性取決於對象是否具有適當定義的正確方法。至於Python 2.7版:

object.__nonzero__(self)

調用,實現真值測試和內置操作bool();應返回FalseTrue,或其整數等效值01。如果未定義此方法,則調用__len__()(如果已定義),並且如果該對象的結果非零,則該對象被視爲真。如果一個類既沒有定義__len__()也沒有定義__nonzero__(),它的所有實例都被認爲是真實的。

也有看看PEP 8,對於這個問題(重點煤礦)提供指導:

比較像None單身應始終isis not,從來沒有平等的運營商完成。

另外,當您的確切意思是if x is not None - 例如,請謹防寫入if x。當測試一個變量或參數默認爲None是否被設置爲某個其他值時。 其他值可能有一個類型(如容器),可能在布爾上下文中爲false!

因此,要安全地測試你是否已經有了Nonenot None您應該專門使用:

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

在布爾評估xml.etree.ElementTree.Element語義的情況下,從None -ness不同

0123:對象的

參考:

+3

[pep 8](http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations)也有這樣一個詞:*另外,當你的時候要小心寫''if x''真的意思是''如果x不是None'' * –

+1

@JonasWielicki謝謝你的參考! – moooeeeep

+0

非常感謝您的回答。你能說出在Python 3中發生了什麼:評估一個變量引用的值是否可以是布爾值? – giga

2

ElementTree行爲節點沒有孩子是從標準的Python實踐出發臭名昭著。一般來說,只要在if條件中使用變量並假定布爾值是合理的就可以了。在這種情況下,正如你親身體驗過的那樣,你必須做更明確的檢查。

1

對於你的情況,它是安全的,因爲ElementTree returns False to the __nonzero__ test檢查,如果該元素已被發現或不

但是,隨着醫生說,這是更好,如果你只想檢查元素一直沒有找到明確檢查,以is None

警告:由於Element對象沒有定義非零的()方法,沒有子元素的元素將測試爲False。

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()操作中使用。