Вступление во вкусную дискуссию или любую дискуссию, воспринимаемую как таковую, как правило, является пустой тратой времени, независимо от того, насколько хороши аргументы.
Вне более общих принципов, моя предпочтительная практическая причина иметь назначение - выражениедолжен иметь читаемый эквивалент оператора case, когда я хочу сопоставить строку с несколькими шаблонами (извлечение под-шаблонов), пока один из них не завершится успешно.Может быть, у кого-то есть хорошее решение, которого я не видел.
В любом случае ... почему бы не сделать всех счастливыми, сделав доступными оба мира с помощью интерпретируемого комментария в начале файла модуля, в котором прямо указано, что назначенияможет использоваться как выражение, если программист этого пожелает?
Люди, удовлетворенные текущей ситуацией, не увидят никаких изменений, и их синтаксические ошибки будут по-прежнему обнаруживаться таким же образом.
Илюди, которые хотят использовать присваивание в качестве выражений, просто скажут так.
Я не вижу возможности использовать присвоения в качестве выражений в существующей программе, которая не использовала их (просто добавив предложенный комментарий выше)изменит семантику этой программы.
Peace.
Post-sriptum - Это добавляется после того, как первые пять абзацев раздела 1 в обсуждении ниже были опубликованы.
Я не знаю, почему разработчики Python сделали такой выбор.Избегание общепризнанной ошибки if a=b : ...
вместо if a==b : ...
вряд ли является оправданием.
Во-первых, этого можно легко избежать с помощью другой записи для назначения, такой как :=
или <-
, болееуместно, поскольку присваивание не является симметричным и используется в некоторых ранних предках Python.
Во-вторых, та же проблема допускается в другом контексте.Можно написать a = b=c
, имея в виду на самом деле написать a = b==c
, что совсем другое.И ошибка не так заметна, когда b
и c
являются большими выражениями.Кроме того, хотя это, вероятно, было бы обнаружено как ошибка типа, если бы язык был статически типизирован, это не так в динамически типизированном языке, таком как Python (это действительно верно для =
против ==
во всех контекстах).
Этот допуск тем более удивителен, что множественное назначение формы a = b = c
вряд ли является существенной особенностью языка, вряд ли очень полезной.
Все это похоже на пережитки ранних проектных решенийнекоторые мотивируются сходством с существующими языками, такими как C или Bash, потому что Python также является языком сценариев, но стал гораздо большим.Другими словами, это кажется более случайным, чем хорошо продуманный дизайн.Надеемся, что это не то, что люди имеют в виду, говоря о питонизме.
Как говорится, это небольшие синтаксические ограничения, хотя и раздражающие.В целом язык кажется гораздо лучше спроектированным (с некоторыми ментальными ограничениями в отношении правил области видимости, пока я не решусь на его логику).
Интересным аспектом этого обсуждения является то, что запрет присваивания как выражения (хотя онможет быть решено путем изменения обозначений) также необходимо из-за отсутствия статической типизации.Но следует ожидать, что отсутствие статической типизации, которая является законным выбором дизайна, затрудняет выявление множества ошибок.Это очень общее наблюдение.Тем не менее, это выбор, сделанный дизайнерами Python.Да будет так.
Но тогда они вряд ли могут сожалеть о том, что путаницу между равенством и назначением будет сложнее уловить.Это только прямое следствие, одно из многих последствий их выбора конструкции большей гибкости за счет обнаружения ошибок.Таким образом, обнаружение ошибок является плохим оправданием для этого ограничения при назначении.
Что касается того факта, что назначение выражения будет смешивать функциональный и императивный стиль, это не проблема.Микширование уже повсюду в языке.
Есть ли письменное обоснование для Python, которое документирует выбор дизайна в целом и обсуждаемую здесь проблему, в частности?