Другой возможный вариант, но это зависит от того, имеется ли в виду под перед :
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!
Это позволяет вам даже проверять атрибуты без значений.
Но! Будьте очень осторожны, чтобы случайно не создать и не сравнить undefined
в нескольких местах, потому что is
никогда не будет работать в этом случае.
Обновление:
из-за того, о чем я предупреждал в предыдущем абзаце, имея несколько неопределенных значений, которые никогда не совпадают, я недавно немного изменил этот шаблон:
undefined = NotImplemented
NotImplemented
, не путать с NotImplementedError
, является встроенным: он частично совпадает с намерением JS undefined
, и вы можете повторно использовать его определение везде, и оно всегда будет совпадать. Недостатком является то, что это "правдиво" в логических значениях и может выглядеть странно в журналах и трассировках стека (но вы быстро преодолеете это, когда знаете, что оно появляется только в этом контексте).
Кажется, он также работает для проверки функций в пространстве имен, например:
import string hasattr(string, "lower")
hasattr
- это то же самое, что и использованиеtry
/except AttributeError
: в строке документации hasattr (в Python 2.7) говорится, что он использует getattr для перехвата исключений.@JeffTratner:
hasattr
, к сожалению, не точно то же самое, чтоtry: ... except AttributeError:
в Python 2.x, посколькуhasattr
будет перехватить все исключения . См. Мой ответ для примера и простого обходного пути.hasattr не работает, если ваш объект - dict. В этих случаях используйте оператор in или метод haskey.