Другой возможный вариант, но это зависит от того , что вы подразумеваете , прежде чем :
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()
вывод:
bar:1
zoom!
Это позволяет вам даже проверять None-значимые атрибуты.
Но! Будьте очень осторожны, вы не случайно создадите и сравните undefined
несколько мест, потому что is
в этом случае они никогда не сработают.
Обновить:
из-за того, о чем я предупреждал в предыдущем абзаце, имея несколько неопределенных, которые никогда не совпадают, я недавно немного изменил этот шаблон:
undefined = NotImplemented
NotImplemented
, не путать с NotImplementedError
, является встроенным: он почти соответствует цели JS, undefined
и вы можете использовать его определение везде, и оно всегда будет совпадать. Недостатки в том, что он «правдив» в логических значениях и может выглядеть странно в журналах и трассировках стека (но вы быстро справляетесь с этим, когда знаете, что он появляется только в этом контексте).
import string hasattr(string, "lower")