2014-05-12 14 views
6

E 'sicuro per controllare se una variabile myvar ha valore non-None semplicemente:Verificare se il nodo XML ElementTree è Nessuno/Falso

if myvar: 
    print('Not None detected') 

che sto chiedendo questo perché ho una variabile ed è stato verificare se la variabile non era None semplicemente if variable: ma il controllo non ha funzionato. La variabile contiene alcuni dati ma stava valutando su False nel controllo if.

codice completo:

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

Questo è in realtà sbagliato. '' se myvar: '' assumendo '' myvar'' è '' None'' in realtà non valuterà '' True'' e quindi il tuo campione non funzionerà. È comunque consigliabile utilizzare il modulo: '' se myvar non è None: '' or '' se myvar è None: '' –

+0

Qui è stata data una risposta: http://stackoverflow.com/questions/3965104/not-none -test-in-python – ka2m

+0

Il tuo controllo fallisce perché non c'è testo in udh? Potrebbe essere un nodo XML vuoto. – Midnighter

risposta

5

In Python il valore booleano (vero) dell'oggetto non è necessariamente uguale a None oppure no. La correttezza di questa ipotesi dipende dal fatto che l'oggetto abbia i metodi corretti definiti in modo appropriato. Da per Python 2.7:

object.__nonzero__(self)

Chiamato per implementare verità test valore e integrata operazioni bool(); deve restituire False o True oppure i loro equivalenti interi 0 o 1. Quando questo metodo non è definito, viene chiamato __len__(), se è definito, e l'oggetto è considerato true se il suo risultato è diverso da zero. Se una classe non definisce né __len__()__nonzero__(), tutte le sue istanze sono considerate vere.

hanno anche uno sguardo al PEP 8, che fornisce le linee guida per questo problema (sottolineatura mia):

I paragoni con single come None dovrebbe sempre essere fatto con is o is not, mai i operatori di uguaglianza .

Inoltre, fare attenzione a scrivere if x quando si intende veramente if x is not None - ad es. quando si verifica se una variabile o argomento che ha come valore predefinito None è stato impostato su un altro valore. L'altro valore potrebbe avere un tipo (come un contenitore) che potrebbe essere falso in un contesto booleano!

Pertanto, per testare in modo sicuro se hai None o not None si dovrebbe usare particolare:

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

Nel caso dei xml.etree.ElementTree.Element la semantica della valutazione booleana differire dal None -ness dell'oggetto:

Per riferimento:

+3

[pep 8] (http://legacy.python.org/dev/peps/pep-0008/#programming-recommendations) ha una parola anche su questo: * Inoltre, fai attenzione a scrivere '' se x'' quando significa veramente '' se x non è None'' * –

+1

@JonasWielicki grazie per tale riferimento! – moooeeeep

+0

Grazie mille per la risposta. Puoi dire cosa succede in Python 3 per valutare se un valore riferito da una variabile può essere Booleano? – giga

2

Il ElementTree comportamento per i nodi senza figli è una partenza noto dalla pratica standard di Python. In generale, sarebbe sicuro usare semplicemente la variabile nella condizione if e assumere che il valore booleano sia ragionevole. In questo caso, come hai vissuto in prima persona, dovrai fare un controllo più esplicito.

1

Per il vostro caso, è sicuro in quanto ElementTree returns False to the __nonzero__ testper verificare se l'elemento è stato trovato o non.

Tuttavia, come il dottore dice, è meglio controllare in modo esplicito, con is None se si desidera controllare solo se l'elemento non è stato trovato:

Attenzione: Poiché gli oggetti Element non definiscono una diverso da zero(), gli elementi senza sottoelementi verranno testati come 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" 

Per promemoria, object.__nonzero__ viene utilizzato nei test valore e nel funzionamento bool().

Problemi correlati