¿Cómo funciona la comparación de intervalos?

De alguna manera, esto funciona:

def in_range(min, test, max): return min <= test <= max print in_range(0, 5, 10) # True print in_range(0, 15, 10) # False 

Sin embargo, no puedo entender el orden de las operaciones aquí. Probemos el caso False :

 print 0 <= 15 <= 10 # False print (0 <= 15) <= 10 # True print 0 <= (15 <= 10) # True 

Claramente, esto no está resolviendo un simple problema de orden de operaciones. ¿Es la comparación de intervalos un operador especial, o algo más está sucediendo?

A diferencia de la mayoría de los idiomas, Python es compatible con operadores de comparación encadenados y los evalúa como serían evaluados en matemáticas normales.

Esta línea:

 return min <= test <= max 

Es evaluado por Python así:

 return (min <= test) and (test <= max) 

Sin embargo, la mayoría de los otros idiomas lo evaluarían así:

 return (min <= test) <= max 

Como se especifica en la documentación de Python :

Las comparaciones se pueden encadenar arbitrariamente, por ejemplo, x < y <= z es equivalente a x < y and y <= z , excepto que y se evalúa solo una vez (pero en ambos casos no se evalúa en absoluto cuando se encuentra x < y ser falso).

Formalmente, si a , b , c , ..., y , z son expresiones y op1 , op2 , ..., opN son operadores de comparación, entonces a op1 b op2 c ... y opN z es equivalente a a op1 b and b op2 c and ... y opN z , excepto que cada expresión se evalúa como máximo una vez.