La razón por la que no hay is Empty
es sorprendentemente simple una vez usted entiende lo que hace el operador is
.
Desde el python manual:
los operadores is
y is not
prueba de la identidad del objeto: x is y
es cierto si y sólo si x
y y
son el mismo objeto. x is not y
produce el valor de verdad inversa .
Eso significa some_sequence is Empty
comprueba si some_sequence
es el mismo objeto que Empty
. Eso no puede funcionar de la manera que sugeriste.
Consideremos el siguiente ejemplo:
>>> a = []
>>> b = {}
Ahora vamos a suponer que hay esta is Empty
construcción en Python:
>>> a is Empty
True
>>> b is Empty
True
Pero dado que el operador is
hace control de identidad que significa que a
y b
son idénticos a Empty
. Que a su vez debe significar que a
y b
son idénticos, pero no lo son:
>>> a is b
False
Así que para responder a su pregunta "¿por qué no hay is Empty
en Python?": Porque is
hace control de identidad.
el fin de tener el constructo is Empty
que debe o piratear el operador is
para significar otra cosa o crear algún Empty
objeto mágico que de alguna manera detecta colecciones vacías y luego ser idénticos a ellos.
En lugar de preguntar por qué no hay is Empty
debe preguntar por qué no hay una función integrada isempty()
que llame al método especial __isempty__()
.
Así que en lugar de utilizar booleaness implícita:
if saved:
mess_up()
tenemos explícita de verificación vacía:
if not isempty(saved):
mess_up()
donde la clase de saved
tiene un método implementado __isempty__()
a cierta lógica cuerdo.
Creo que es mucho mejor que usar Booleaness implícita para comprobar el vacío.
Por supuesto se puede definir fácilmente su propia función isempty()
:
def isempty(collection):
try:
return collection.__isempty__()
except AttributeError:
# fall back to implicit booleaness but check for common pitfalls
if collection is None:
raise TypeError('None cannot be empty')
if collection is False:
raise TypeError('False cannot be empty')
if collection == 0:
raise TypeError('0 cannot be empty')
return bool(collection)
y luego definir un método __isempty__()
que devuelve un valor lógico para todas las clases de colección.
'guardado! = []' Y 'guardado == []' funcionan bien. ¿Cómo son esos controles de vacío no explícitos? ¿Acabas de decir que 'is' es más estricto que' == '? –