Otra opción posible, pero depende de a qué te refieres antes :
undefined = object()
class Widget:
def __init__(self):
self.bar = 1
def zoom(self):
print("zoom!")
a = Widget()
bar = getattr(a, "bar", undefined)
if bar is not undefined:
print("bar:%s" % (bar))
foo = getattr(a, "foo", undefined)
if foo is not undefined:
print("foo:%s" % (foo))
zoom = getattr(a, "zoom", undefined)
if zoom is not undefined:
zoom()
salida:
bar:1
zoom!
Esto le permite incluso verificar los atributos sin valor.
¡Pero! Tenga mucho cuidado de no crear instancias accidentalmente y comparar undefined
varios lugares porque is
nunca funcionará en ese caso.
Actualizar:
Debido a lo que estaba advirtiendo en el párrafo anterior, al tener múltiples indefinidos que nunca coinciden, recientemente he modificado ligeramente este patrón:
undefined = NotImplemented
NotImplemented
, que no debe confundirse con NotImplementedError
, es una función incorporada: coincide con la intención de un JS undefined
y puede reutilizar su definición en todas partes y siempre coincidirá. El inconveniente es que es "verdadero" en los booleanos y puede verse raro en los registros y los rastros de la pila (pero lo superas rápidamente cuando sabes que solo aparece en este contexto).
import string hasattr(string, "lower")