Inna możliwa opcja, ale zależy to od tego, co masz na myśli wcześniej :
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()
wynik:
bar:1
zoom!
Pozwala to nawet sprawdzić atrybuty Bez wartości.
Ale! Uważaj, aby przypadkowo nie utworzyć instancji i nie porównać undefined
wielu miejsc, ponieważ is
w takim przypadku nigdy nie zadziała.
Aktualizacja:
z powodu tego, o czym ostrzegałem w powyższym akapicie, mając wiele niezdefiniowanych, które nigdy nie pasują, ostatnio nieznacznie zmodyfikowałem ten wzorzec:
undefined = NotImplemented
NotImplemented
, nie należy mylić NotImplementedError
, jest wbudowany: jest częściowo zgodny z intencją JS undefined
i możesz ponownie użyć jego definicji wszędzie i zawsze będzie pasować. Wadą jest to, że jest „prawdziwa” w logach i może wyglądać dziwnie w logach i śladach na stosie (ale szybko się z tego obchodzisz, gdy wiesz, że pojawia się tylko w tym kontekście).
import string hasattr(string, "lower")