озадачивает поведение python dict.get () с индексом dict по умолчанию - PullRequest
0 голосов
/ 10 февраля 2020

, поэтому я столкнулся с недоумением при использовании метода dict.get () в python в сочетании со значением по умолчанию для dict [index]:

d = {1: 1}
d2 = {2: 2}
#throws KeyError
d.get(1, d2[1])

Я мало что потеряно в том, почему это происходит .... на мой взгляд, индекс d2 никогда не следует вызывать, учитывая, что ключ 1 существует в d. Я предполагаю, что это деталь реализации, которую мне не хватает, и я не могу найти больше информации.

Есть ли какая-нибудь помощь / надежда для меня?

Ответы [ 2 ]

4 голосов
/ 10 февраля 2020

Выражения, используемые для аргументов get (или любой функции), должны быть оценены до вызова get. Python не имеет семантики отложенной оценки, и это является частью определения языка, а не детали реализации CPython.

Сравните это с чем-то вроде типа defaultdict, который принимает вызываемый , который возвращает значение по умолчанию, а не само значение по умолчанию.

defaultdict(lambda: 3)  # not defaultdict(3)
defaultdict(int)  # not defaultdict(0); int happens to return
                  # 0 when called with no arguments.

get, однако, ожидает значение, а не функцию, которую можно вызвать для получения значение.

1 голос
/ 10 февраля 2020

d.get(1, d2[1]) не является условным / ветвящимся оператором или выражением, как if, это просто обычный вызов метода, поэтому весь код оценивается безоговорочно.

Перед методом get можно вызвать, его аргументы должны быть оценены. d2[1] является вторым аргументом, поэтому он оценивается - поднимая KeyError - до того, как метод будет вызван вообще. Так что это ожидаемое поведение, а не детали реализации.

Чтобы сделать то, что вы хотите, вы можете использовать условное выражение, как показано ниже, которое будет вызывать KeyError только тогда, когда ни в одном словаре нет ключа. Выражение d2[1] не выполняется, если условие не ложно, поскольку выражение if ветвится.

d[1] if 1 in d else d2[1]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...