2011-04-26 24 views
5

Soy nuevo en Python e intento crear un proyecto de práctica que lea algunos XML. Por alguna razón, esta instrucción if se activa incluso para líneas blancas en blanco:Legit python if statement?

if '<' and '>' in line: 

¿Alguna idea de por qué?

+0

¿Por qué escribió esta afirmación? ¿Dónde has visto código como este? ¿Qué crees que se supone que debe hacer esto? –

Respuesta

9

Su código dice (parethesised para mayor claridad):

if '<' and ('>' in line): 

que será evaluado:

if True and ('>' in line): 

que en su caso se evalúa como true cuando no se tiene la intención de. Por lo tanto, probar este lugar (entre paréntesis son opcionales, pero agregó que para mayor claridad):

if ('<' in line) and ('>' in line): 
+4

¿Cómo es 'if true y ('>' en línea):' siempre verdadero? Podría ver si usa 'o'. –

+0

Ahora también tiene mye mezclando mis pares :-P Fixed ... –

+0

¿De verdad trataste de escribir algo de eso en el prompt interactivo? La precedencia relativa de 'in' y' and' es correcta en este caso sin paréntesis y 'True in ''' no siempre devuelve 'True', sino que levanta' TypeError'. – ncoghlan

9

es probable que desee:

if ('<' in line) and ('>' in line): 

Su versión está siendo interpretado como esto:

if ('<') and ('>' in line): 

que no es probable que lo que quería decir.

Use paréntesis para hacer las cosas súper obvias.

+0

Esto es exacto, pero no explica el problema del OP (es decir, si 'line == ''' la expresión del OP todavía debe devolver 'False' a pesar de su error). – ncoghlan

2

Probar:
if '<' in line and '>' in line:

me gustaría sugerir la lectura de un libro sobre Python antes de la inmersión, evitará un montón de trampas :)

3

¿Cómo está usted seguro de que line es realmente vacío cuando se golpea una línea en blanco en el archivo?

Cuando se escribe '<' and '>' in line el intérprete ve que como '<' and ('>' in line) que no es lo que quiere: lo que busca es algo más parecido a '<' in line and '>' in line o all(x in line for x in '<>'). Ninguna de esas expresiones, incluida su original, será verdadera cuando line esté vacía. La forma incorrecta de la expresión será, pero dará una respuesta incorrecta cuando la cadena contenga solo '>'.

>>> '<' and '>' in '' 
False 
>>> '<' and '>' in '<' 
False 
>>> '<' and '>' in '>' # Huh? 
True 
>>> 1 and 0 in [0] # Perhaps this will clarify matters 
True 

pesar de todo, no analizar XML con la mano - utilizar una biblioteca de análisis XML, tales como el módulo de xml.etree.ElementTree incluido en la biblioteca estándar.