2014-05-12 13 views
6

Có an toàn để kiểm tra xem một biến myvar đã không-Không giá trị bằng cách đơn giản:Kiểm tra xem nút xml ElementTree là None/False

if myvar: 
    print('Not None detected') 

tôi yêu cầu này bởi vì tôi có một biến và đã được kiểm tra xem biến không phải là None chỉ đơn giản là if variable: nhưng kiểm tra đã không thành công. Biến chứa một số dữ liệu nhưng nó được đánh giá là False trong kiểm tra if.

Full Code:

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

Điều này thực sự sai. '' nếu myvar: '' giả định '' myvar'' là '' None'' sẽ không thực sự đánh giá '' True'' và do đó mẫu của bạn sẽ không hoạt động. Tuy nhiên, thực hành tốt nhất để sử dụng biểu mẫu: '' nếu myvar không phải là None: '' hoặc '' nếu myvar là None: '' –

+0

Đã được trả lời ở đây: http://stackoverflow.com/questions/3965104/not-none -test-in-python – ka2m

+0

Không phải là kiểm tra của bạn thất bại vì không có văn bản trong udh? Nó có thể là một nút XML rỗng. – Midnighter

Trả lời

5

Trong Python giá trị boolean (chân lý) của đối tượng không nhất thiết phải bằng None hay không. Tính chính xác của giả định đó phụ thuộc vào việc đối tượng của bạn có phương pháp đúng được xác định một cách thích hợp hay không. Đối với Python 2.7:

object.__nonzero__(self)

gọi để thực hiện kiểm tra giá trị chân lý và được xây dựng trong hoạt động bool(); phải trả lại False hoặc True hoặc số nguyên tương đương 0 hoặc 1. Khi phương thức này không được xác định, __len__() được gọi, nếu nó được xác định, và đối tượng được coi là đúng nếu kết quả của nó không phải là nonzero. Nếu một lớp xác định không __len__() cũng không __nonzero__(), tất cả các trường hợp của nó được coi là đúng.

Cũng có một cái nhìn tại PEP 8, cung cấp hướng dẫn cho vấn đề (tôi nhấn mạnh) này:

So sánh để độc thân như None nên luôn luôn được thực hiện với is hoặc is not, không bao giờ các nhà khai thác bình đẳng .

Ngoài ra, hãy cẩn thận khi viết if x khi bạn thực sự có nghĩa là if x is not None - ví dụ: khi kiểm tra xem một biến hoặc đối số mặc định là None đã được đặt thành một số giá trị khác hay không. Giá trị khác có thể có loại (chẳng hạn như vùng chứa) có thể sai trong ngữ cảnh boolean!

Vì vậy, để an toàn kiểm tra xem bạn đã có None hoặc not None bạn nên sử dụng cụ thể:

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

Trong trường hợp của xml.etree.ElementTree.Element ngữ nghĩa của việc đánh giá boolean khác với None -ness của đối tượng:

Để tham khảo:

+3

[pep 8] (http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations) cũng có một từ về điều này: * Ngoài ra, hãy cẩn thận khi viết '' nếu x'' khi bạn thực sự có nghĩa là '' nếu x không phải là None'' * –

+1

@JonasWielicki cảm ơn vì tham chiếu đó! – moooeeeep

+0

Cảm ơn rất nhiều vì câu trả lời của bạn. Bạn có thể nói điều gì xảy ra trong Python 3 để đánh giá liệu một giá trị được tham chiếu bởi một biến có thể là Boolean không? – giga

2

Các ElementTree hành vi cho các nút không có con cái là một sự khởi đầu khét tiếng từ thực tiễn Python chuẩn. Nói chung, sẽ an toàn khi chỉ sử dụng biến trong điều kiện if của bạn và giả định rằng giá trị boolean là hợp lý. Trong trường hợp này, như bạn đã trải qua tay đầu tiên, bạn sẽ phải làm một kiểm tra rõ ràng hơn.

1

Đối với trường hợp của bạn, nó là an toàn từ ElementTree returns False to the __nonzero__ testđể kiểm tra xem phần tử đã được tìm thấy hoặc không.

Tuy nhiên, khi doc nói, nó là tốt hơn để kiểm tra một cách rõ ràng, với is None nếu bạn muốn kiểm tra chỉ khi nguyên tố này vẫn chưa được tìm thấy:

Chú ý: Bởi vì đối tượng phần tử không xác định một phương thức nonzero(), các phần tử không có phần tử con sẽ kiểm tra là Sai.

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" 

Đối với lời nhắc nhở, object.__nonzero__ được sử dụng trong thử nghiệm giá trị và trong hoạt động bool().

Các vấn đề liên quan