setdefault Python позволяет Вам получать значение из словаря, но если ключ не существует, то Вы присваиваетесь на основе параметра default
. Вы затем выбираете то, что в ключе в словаре.
Не управляя объектом __dict__
Существует ли подобная функция для объектов?
например.
У меня есть объект foo
который может или не может иметь атрибута bar
. Как может я делать что-то как:
result = setdefaultattr(foo,'bar','bah')
Python не имеет встроенного модуля, но вы можете определить свой собственный:
def setdefaultattr(obj, name, value):
if not hasattr(obj, name):
setattr(obj, name, value)
return getattr(obj, name)
Не делайте этого.
Используйте __ init __
, чтобы указать значения по умолчанию. Это питонический путь.
class Foo( object ):
def __init__( self ):
self.bar = 'bah'
Это нормальный, стандартный, типичный подход. Нет веских причин поступать иначе.
Обратите внимание, что в принятом на данный момент ответе, если атрибут еще не существует, будут вызываться hasattr (), setattr () и getattr (). Это было бы необходимо только в том случае, если OP выполнил что-то вроде переопределения setattr и / или getattr - и в этом случае OP не является невиновным запросчиком, за которого мы его приняли. В противном случае вызов всех трех функций является грубым; за вызовом setattr () должно следовать возвращаемое значение
, чтобы оно не попало в return getattr (....)
Согласно docs hasattr () реализуется вызовом getattr () и перехватом исключений. Следующий код может быть быстрее, если атрибут уже существует:
def setdefaultattr(obj, name, value):
try:
return getattr(obj, name)
except AttributeError:
setattr(obj, name, value)
return value