Почему это бросить исключение KeyError:Python dict.get ('ключ') по сравнению с Dict [ 'ключ']
d = dict()
d['xyz']
Но это не делает?
d = dict()
d.get('xyz')
Мне также интересно, если дескрипторы играют здесь роль.
Почему это бросить исключение KeyError:Python dict.get ('ключ') по сравнению с Dict [ 'ключ']
d = dict()
d['xyz']
Но это не делает?
d = dict()
d.get('xyz')
Мне также интересно, если дескрипторы играют здесь роль.
Это просто метод 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
Доступ кронштейнами не имеет значения по умолчанию, но метод 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] ключ не на карте и [2], эти две операции отличаются по своей природе.
С dict типов отображения:
d[key]
Возвращает элемент г с ключом ключа. Повышает значение KeyError, если на карте нет ключа.
get(key[, default])
Возврат значения для ключа, если ключ находится в словаре, иначе по умолчанию. Если значение по умолчанию не задано, по умолчанию оно равно None, так что этот метод никогда не вызывает KeyError.
Ваш вопрос открытия хорошо ответил, я верю, но я не вижу никакого ответа на
I'm also curious if descriptors play a role here.
Технически дескрипторы делать здесь играет роль, поскольку все методы реализованы неявно с дескриптором , но нет явных явных дескрипторов, которые используются, и они не имеют никакого отношения к поведению, которое вы задаете.
Это практически практическая разница между двумя способами - она существует, поэтому вы можете обрабатывать «Нет» (или заданный по умолчанию) или исключения по своему усмотрению. Вас интересуют детали реализации? – TigerhawkT3
Спасибо, да, мне интересно узнать подробности нижнего уровня, в частности, о том, как избежать KeyError с помощью конструкции «if k in d». И это KeyError с d ['xyz'] (если «xyz» не существует), потому что это «сырой» или прямой доступ к объекту dict? Мне кажется, что ответ на мой вопрос, поскольку я сказал, что это «потому что это так, как это работает», поэтому, возможно, я делаю слишком много того, что в конечном итоге является дизайнерским решением, т. Е. Когда поднимать суету и когда этого не делать. – foundling
Детали нижнего уровня не трудно себе представить; вы можете написать эквивалентный метод самостоятельно, просто вернув второй аргумент, переданный в keyError. –