Інший можливий варіант, але це залежить від того , що ви маєте на увазі , перш ніж :
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
і ви можете повторно використовувати його визначення скрізь, і воно завжди буде відповідати. Недоліки полягають у тому, що він є "truthy" в booleans, і він може виглядати дивно в журналах і стеках слідів (але ви швидко перебираєте це, коли знаєте, що це з'являється лише в цьому контексті).
import string hasattr(string, "lower")