Марк Лутц - Изучаем Python, Четвертое издание (1184811), страница 83
Текст из файла (страница 83)
перев.2Известна программистская шутка, уместная в данном контексте: это не bug, этоfeature. – Примеч. перев.История о двух if329от левого края. По величине отступа интерпретатор определяет, где находитсяначало блока и где – конец:if x > y:x = 1y = 2Под отступами в данном примере я подразумеваю пустое пространство слеваот двух вложенных инструкций. Интерпретатор не накладывает ограниченийна то, как выполняются отступы (для этого можно использовать символы пробела или символы табуляции), и на величину отступов (допускается использовать любое число пробелов или символов табуляции).
При этом отступ дляодного вложенного блока может существенно отличаться от отступа для другого блока. Синтаксическое правило состоит лишь в том, что все инструкциив пределах одного блока должны иметь один и тот же отступ от левого края.Если это не так, будет получена синтаксическая ошибка, и программный кодне будет работать, пока вы не исправите отступ.Почему отступы являются частью синтаксиса?Правило оформления отступов может показаться необычным на первый взгляддля программистов, работавших с C-подобными языками программирования,но это было сделано преднамеренно и является одним из основных способов,которыми язык Python вынуждает программистов писать однородный и удобочитаемый программный код.
По существу это означает, что вы должны выстраивать свой программный код вертикально, выравнивая его в соответствиис логической структурой. В результате получается менее противоречивый и более удобочитаемый программный код (в отличие от большей части кода, написанного на C-подобных языках).Требования к выравниванию программного кода в соответствии с его логической структурой – это главная составляющая, способствующая созданиюудобочитаемого кода, и, следовательно, кода, пригодного к многократному использованию и простого в сопровождении как вами, так и другими. Фактически даже если ранее вы никогда не использовали Python, после прочтенияэтой книги у вас должна выработаться привычка оформлять отступы в программном коде для удобочитаемости в любом языке программирования.
ЯзыкPython вносит определенные ограничения, сделав отступы частью синтаксиса,но они достаточно важны для любого языка программирования и оказываютогромное влияние на применимость вашего программного кода.Ваш опыт может отличаться от моего, но когда я занимался разработкой полный рабочий день, мне платили зарплату за работу над крупными старымипрограммами, написанными на языке C++, над которыми долгие годы трудились множество программистов. Практически у каждого программиста былсвой стиль оформления программного кода.
Например, мне часто приходилосьизменять циклы while, написанные на языке C++, которые начинались примерно так:while (x > 0) {Даже еще не дойдя до отступов, мы можем столкнуться с тремя или четырьмяспособами расстановки фигурных скобок в C-подобных языках. В организациях часто ведутся жаркие споры и пишутся стандарты по оформлению ис-330Глава 10. Введение в инструкции языка Pythonходных текстов программ (обсуждение которых сильно выходит за рамки проблем, которые решаются в процессе программирования).
Оставим этот вопросв стороне, ниже приводится пример оформления, с которым мне часто приходилось сталкиваться в программном коде на языке C++. Первый программист,который поработал над этим циклом, оформлял отступы четырьмя пробелами:while (x > 0) {--------;--------;Со временем этот программист был переведен на руководящую должность,и его место занял другой, который предпочитал использовать более широкиеотступы:while (x > 0) {--------;--------;--------;--------;Позднее и он ушел на другую работу, а его место занял третий, которому ненравилось делать отступы:while (x > 0) {--------;--------;--------;--------;--------;--------;}И так далее. В конце блок завершается закрывающей фигурной скобкой (}),которая и делает этот фрагмент структурированным (о чем можно говоритьс определенной долей сарказма).
В любом блочно-структурированном языкепрограммирования, будь то Python или другой язык, если вложенные блоки неимеют непротиворечивых отступов, их очень сложно читать, изменять и приспосабливать для многократного использования. Отступ – это важная составляющая поддержки удобочитаемости.Ниже приводится другой пример, на котором, возможно, вам приходилосьобжечься, если вы достаточно много программировали на C-подобном языке.Взгляните на следующие инструкции языка C:if (x)if (y)statement1;elsestatement2;К какому оператору if относится инструкция else? Это удивительно, но инструкция else относится к вложенному оператору if (if(y)), даже при том, чтовизуально она выглядит так, как если бы относилась к внешнему операторуif (if(x)). Это классическая ловушка языка C и она может привести к неправильному пониманию программного кода тем, кто его изменяет, и к появлениюошибок при его изменении, которые будут обнаружены, только когда марсоходврежется в скалу!История о двух if331Такого не может произойти в языке Python, потому что отступы для него имеют важное значение и программный код работает именно так, как выглядит.Взгляните на эквивалентный фрагмент на языке Python:if x:if y:statement1else:statement2В этом примере инструкции if и else, расположенные на одной вертикальной линии, связаны логически (внешний оператор if x).
В некотором смыслеPython – это язык типа WYSIWYG (�����What� �����������You���������������See�������Is� �����What� �����������������You���������������������������Get���������� – что видишь, то и получаешь) – что вы видите, то и получаете, потому что порядокоформления программного кода определяет порядок его выполнения, независимо от предпочтений того, кто его пишет.Если этого недостаточно, чтобы осознать преимущества синтаксиса языкаPython, приведу одну историю. В начале своей карьеры я работал в одной благополучной компании, занимавшейся разработкой программных систем наязыке C, который вообще не предъявляет никаких требований к оформлениюотступов. Но, несмотря на это, когда в конце рабочего дня мы отправляли свойпрограммный код в репозитарий, он автоматически проверялся сценарием,анализировавшим оформление отступов.
Если сценарий обнаруживал несоответствия, на следующий день утром мы получали электронные письма с замечаниями – и такой порядок завели наши начальники!По моему мнению, даже если язык программирования и не требует этого, хороший программист должен понимать, какое важное значение имеет выравнивание для удобочитаемости и высокого качества программного кода. Тот факт,что в языке Python отступы были возведены в ранг синтаксиса, по большейчасти выглядит как достоинство языка.Наконец, имейте в виду, что практически любой текстовый редактор с дружественным (для программистов) интерфейсом обладает встроенной поддержкой синтаксической модели языка Python. В Python-среде разработки IDLE,например, отступы оформляются автоматически1, когда начинается ввод вложенного блока; нажатие клавиши Backspace (забой) возвращает на один уровеньвложенности выше, а кроме того, IDLE позволяет настроить величину отступовво вложенном блоке.
Нет никаких стандартных требований к оформлению отступов: чаще всего используются четыре пробела или один символ табуляциина каждый уровень вложенности; вам самим решать, какой ширины отступывы будете использовать. Выполняйте отступ вправо, чтобы открыть вложенный блок, и возвращайтесь на предыдущий уровень, чтобы закрыть его.Вообще говоря, недопустимо смешивать символы табуляции и пробелы дляоформления отступов в одном и том же блоке, если делать это неединообраз-1Напомним, IDLE – среда разработки, специально созданная Гвидо ван Россумомв проекте Python. Первый релиз вышел вместе с версией Python 1.5.2.
Одно из объяснений использования такого слова (idle – бездействующий, ленивый), в отличиеот принятого в других языковых средах термина IDE, объявлено на сайте python.org(http://www.python.org/idle/doc/idlemain.html) и выглядит так: “IDLE – это акронимот Integrated DeveLopment Environment”. См. также главу 3. – Примеч. перев.332Глава 10. Введение в инструкции языка Pythonно.
Для оформления отступов в блоке используйте либо символы табуляции,либо пробелы, но не одновременно те и другие (в действительности Python 3.0теперь считает ошибкой непоследовательное использование символов табуляции и пробелов, как мы увидим в главе 12). Точно так же нежелательно смешивать символы табуляции и пробелы для оформления отступов в любом другом структурированном языке программирования – такой программный кодочень трудно будет читать следующему программисту, если в его текстовомредакторе отображение символов табуляции будет настроено иначе, чем у вас.C-подобные языки позволяют программистам нарушать это правило, но делатьэтого не следует, – в результате может получиться жуткая мешанина.Я не могу не подчеркнуть, что независимо от того, на каком языке вы программируете, вы всегда должны быть последовательными в оформлении отступовдля повышения удобочитаемости.
Фактически если в начале вашей карьерываши учителя не приучили вас к этому, они просто навредили вам. Большинство программистов, особенно те, кому приходится читать чужой код, считаютвеликим благом, что Python возвел отступы в ранг синтаксиса. Кроме того, напрактике замена фигурных скобок символами табуляции является достаточнопростой задачей для инструментальных средств, которые должны выводитьпрограммный код на языке Python.
Вообще, делайте все то же, что вы делаетена языке C, но уберите фигурные скобки, и ваш программный код будет удовлетворять правилам синтаксиса языка Python.Несколько специальных случаевКак уже упоминалось ранее, в синтаксической модели языка Python:•• Конец строки является концом инструкции, расположенной в этой строке(точка с запятой не требуется).•• Вложенные инструкции объединяются в блоки по величине отступов (безфигурных скобок).Эти правила охватывают большую часть программного кода на языке Python,который вы будете писать или с которым придется столкнуться. Однако существуют некоторые специальные правила, которые касаются оформления какотдельных инструкций, так и вложенных блоков.Специальные случаи оформления инструкцийОбычно на каждой строке располагается одна инструкция, но вполне возможно для большей компактности записать несколько инструкций в одной строке,разделив их точками с запятой:a = 1; b = 2; print(a + b)# Три инструкции на одной строкеЭто единственный случай, когда в языке Python необходимо использовать точки с запятой: как разделители инструкций.