Outra opção possível, mas depende se o que você quer dizer com 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()
resultado:
bar:1
zoom!
Isso permite que você verifique se há atributos sem valor.
Mas! Tenha muito cuidado para não instanciar acidentalmente e comparar undefined
vários locais, porque is
nunca funcionará nesse caso.
Atualizar:
por causa do que eu estava avisando no parágrafo acima, tendo vários indefinidos que nunca correspondem, recentemente modifiquei ligeiramente esse padrão:
undefined = NotImplemented
NotImplemented
, para não confundir NotImplementedError
, é um built-in: ele combina semitendamente a intenção de um JS undefined
e você pode reutilizar sua definição em qualquer lugar e sempre corresponderá. A desvantagem é que ele é "verdadeiro" nos booleanos e pode parecer estranho nos logs e nos rastreamentos de pilha (mas você rapidamente supera isso quando sabe que só aparece nesse contexto).
import string hasattr(string, "lower")