2015-05-21 5 views
2

Почему это бросить исключение KeyError:Python dict.get ('ключ') по сравнению с Dict [ 'ключ']

d = dict() 
d['xyz'] 

Но это не делает?

d = dict() 
d.get('xyz') 

Мне также интересно, если дескрипторы играют здесь роль.

+3

Это практически практическая разница между двумя способами - она ​​существует, поэтому вы можете обрабатывать «Нет» (или заданный по умолчанию) или исключения по своему усмотрению. Вас интересуют детали реализации? – TigerhawkT3

+0

Спасибо, да, мне интересно узнать подробности нижнего уровня, в частности, о том, как избежать KeyError с помощью конструкции «if k in d». И это KeyError с d ['xyz'] (если «xyz» не существует), потому что это «сырой» или прямой доступ к объекту dict? Мне кажется, что ответ на мой вопрос, поскольку я сказал, что это «потому что это так, как это работает», поэтому, возможно, я делаю слишком много того, что в конечном итоге является дизайнерским решением, т. Е. Когда поднимать суету и когда этого не делать. – foundling

+0

Детали нижнего уровня не трудно себе представить; вы можете написать эквивалентный метод самостоятельно, просто вернув второй аргумент, переданный в keyError. –

ответ

11

Это просто метод get().

От the Python docs:

Return the value for key if key is in the dictionary, else default. If default is not given, it defaults to None, so that this method never raises a KeyError.

по умолчанию "не обретенный" возвращаемое значение None. Вы можете вернуть любое другое значение по умолчанию.

d = dict() 
d.get('xyz', 42) # returns 42 
2

Доступ кронштейнами не имеет значения по умолчанию, но метод get делает и по умолчанию None. Из документов для ГЭТ (через a = dict(); help(a.get))

Help on built-in function get: 

get(...) 
    D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None. 
1

Просто потому, что [1] ключ не на карте и [2], эти две операции отличаются по своей природе.

С dict типов отображения:

d[key] 

Возвращает элемент г с ключом ключа. Повышает значение KeyError, если на карте нет ключа.

get(key[, default]) 

Возврат значения для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не задано, по умолчанию оно равно None, так что этот метод никогда не вызывает KeyError.

1

Ваш вопрос открытия хорошо ответил, я верю, но я не вижу никакого ответа на

I'm also curious if descriptors play a role here.

Технически дескрипторы делать здесь играет роль, поскольку все методы реализованы неявно с дескриптором , но нет явных явных дескрипторов, которые используются, и они не имеют никакого отношения к поведению, которое вы задаете.

 Смежные вопросы

  • Нет связанных вопросов^_^