PEP 3130: разница между корпусом коммутатора и блоками кода оператора

В PEP 3103 Гвидо обсуждает добавление оператора switch / case в Python с различными школами мысли, методов и объектов. В этом он делает это заявление :

Другое возражение состоит в том, что правило первого использования позволяет обфускацию кода следующим образом:

def foo(x, y): switch x: case y: print 42 

Для неподготовленного глаза (не знакомого с Python) этот код будет эквивалентен этому:

 def foo(x, y): if x == y: print 42 

но это не то, что он делает (если только он не вызывается с тем же значением, что и второй аргумент). Это было рассмотрено, предполагая, что выражениям случая не должно быть позволено ссылаться на локальные переменные, но это несколько произвольно.

Я бы не счел себя неподготовленным или незнакомым с Python, но ничто не выпрыгивает на меня, поскольку эти два блока кода отличаются друг от друга.

Каково это, что он ссылается на это, сделало бы эти две части кода разными в исполнении?

Вы должны прочитать описание в начале этого раздела. «Самое старое предложение об этом – заморозить диспетчерский запрос при первом запуске коммутатора». Это означает, что значение y будет кэшироваться, когда оператор switch сначала запускается, так что если вы сначала назовете его как:

 foo(10,10) 

Последующие вызовы, такие как foo(20,20) , будут фактически сравнивать:

 switch x: case 10: print 42