Теоретически, setdefault
все равно будет удобно, если вы иногда хотите установить значение по умолчанию, а иногда нет. В реальной жизни я не встречал такого случая использования.
Однако из стандартной библиотеки (Python 2.6, _threadinglocal.py) возникает интересный пример использования:
>>> mydata = local()
>>> mydata.__dict__
{'number': 42}
>>> mydata.__dict__.setdefault('widgets', [])
[]
>>> mydata.widgets
[]
Я бы сказал, что использование __dict__.setdefault
- довольно полезный случай.
Редактировать : Как оказалось, это единственный пример в стандартной библиотеке, и он есть в комментарии. Так что, может быть, одного случая недостаточно, чтобы оправдать существование setdefault
. Тем не менее, вот объяснение:
Объекты хранят свои атрибуты в атрибуте __dict__
. Как это бывает, атрибут __dict__
доступен для записи в любое время после создания объекта. Это также словарь, а не defaultdict
. Для объектов в общем случае не имеет смысла иметь __dict__
как defaultdict
, потому что это сделало бы каждый объект, имеющий все допустимые идентификаторы в качестве атрибутов. Поэтому я не могу предвидеть каких-либо изменений в объектах Python, избавляющихся от __dict__.setdefault
, за исключением полного удаления, если это считается бесполезным.