Подтвердить что ты не робот

Python getattr эквивалент для словарей?

Какой самый лаконичный способ сказать в Python: "Дайте мне dict['foo'], если он существует, а если нет, укажите мне другое значение bar"? Если бы я использовал объект, а не словарь, я бы использовал getattr:

getattr(obj, 'foo', bar)

но это вызывает ключевую ошибку, если я попытаюсь использовать словарь вместо этого (различие, которое я нахожу неудачным, исходя из JavaScript/CoffeeScript). Аналогично, в JavaScript/CoffeeScript я просто напишу

dict['foo'] || bar

но опять же это дает KeyError. Что делать? Что-то сжатое, пожалуйста!

4b9b3361

Ответ 1

dict.get(key, default) возвращает dict[key], если ключ в dict, else возвращает значение по умолчанию.

Обратите внимание, что значение по умолчанию для default равно None, поэтому, если вы говорите dict.get(key), а ключ не указан в dict, тогда он просто вернет None вместо того, чтобы поднимать KeyError, как это происходит, когда вы используете [] ключ доступ нотация.

Ответ 2

Также рассмотрите класс defaultdict для модуля коллекции. Это dict, для которого вы можете указать, что он должен вернуть, когда ключ не найден. С его помощью вы можете делать такие вещи, как:

class MyDefaultObj:
    def __init__(self):
        self.a = 1

from collections import defaultdict
d = defaultdict(MyDefaultObj)
i = d['NonExistentKey']
type(i)
<instance of class MyDefalutObj>

что позволяет использовать привычное соглашение d [i].

Однако, как сказал mikej,.get() также работает, но вот форма ближе к вашему примеру JavaScript:

d = {}
i = d.get('NonExistentKey') or MyDefaultObj()
# the reason this is slightly better than d.get('NonExistent', MyDefaultObj())
# is that instantiation of default value happens only when 'NonExistent' does not exist.
# With d.get('NonExistent', MyDefaultObj()) you spin up a default every time you .get()
type(i)
<instance of class MyDefalutObj>