Python operador precedencia de en y comparación

Las siguientes comparaciones producen True :

 >>> '1' in '11' True >>> ('1' in '11') == True True 

Y con los paréntesis a la inversa, obtengo un TypeError:

 >>> '1' in ('11' == True) Traceback (most recent call last): File "", line 1, in  TypeError: argument of type 'bool' is not iterable 

Entonces, ¿cómo consigo False sin paréntesis?

 >>> '1' in '11' == True False 

El manual de Python dice que in y == tienen la misma prioridad:

http://docs.python.org/reference/expressions.html#summary

Por lo tanto, se evalúan de izquierda a derecha de forma predeterminada, pero también hay que considerar el encadenamiento. La expresión que colocó arriba ( '1' in '11' == True ) se está evaluando como …

 ('1' in '11') and ('11' == True) 

que por supuesto es False . Si no sabes qué es el encadenamiento, es lo que te permite hacer algo como …

 if 0 < a < 1: 

en Python, y que eso signifique lo que esperas ("a es mayor que 0 pero menor que 1").

No tiene nada que ver con la precedencia. En la cadena de operadores relacionales de Python, la contención se considera un operador relacional. Por lo tanto:

 '1' in '11' == True 

es lo mismo que:

 ('1' in '11') and ('11' == True) 

lo cual es falso ya que True es 1 y 1 no es igual a “11”.

El encadenamiento le permite escribir x < y < z , y significar x < y and y < z . Mira esta interacción:

 >>> (False == True) == False True >>> False == (True == False) True >>> False == True == False False >>> 

Así que en tu ejemplo, '1' in '11' == True es equivalente a ('1' in '11') and ('11' == True)

Que pasa aqui

 '1' in '11' == True ==> False 

es lo mismo que

 '1' in ('11' == True) 

pero

 ('11' == True) ==> False 

y

 '1' in False 

no está definido.