d.get(1, d2[1])
не является условным / ветвящимся оператором или выражением, как if
, это просто обычный вызов метода, поэтому весь код оценивается безоговорочно.
Перед методом get
можно вызвать, его аргументы должны быть оценены. d2[1]
является вторым аргументом, поэтому он оценивается - поднимая KeyError - до того, как метод будет вызван вообще. Так что это ожидаемое поведение, а не детали реализации.
Чтобы сделать то, что вы хотите, вы можете использовать условное выражение, как показано ниже, которое будет вызывать KeyError только тогда, когда ни в одном словаре нет ключа. Выражение d2[1]
не выполняется, если условие не ложно, поскольку выражение if
ветвится.
d[1] if 1 in d else d2[1]