Лутц М. - Изучаем Python (1077325), страница 81
Текст из файла (страница 81)
Старайтесь не смешивать символы табуляции и пробелы при оформлении отступов в блоке, если вы не знаете точно, как текстовый редактор интерпретирует символы табуляции. В противном случае интерпретатор Глава 14 Документация Ру1Ьоп будет видеть совсем не то, что вы видите на экране, когда он будет выполнять преобразование символов табуляции в пробелы. Это справедливо не только для Ру$Ьоп, но и для любого другого языка программирования с блочно-структурированным оформлением программного кода — если у другого программиста в текстовом редакторе ширина символов табуляции настроена иначе, он не сможет понять структуру вашего программного кода. Для оформления отступов лучше использовать что-то одно — или символы табуляции, или пробелы. ° Не пишите на языке С. Напоминаю программистам, использующим С/С++: нет никакой необходимости заключать условные выражения в круглые скобки в инструкциях г( и илг1е (например, 11 (Х == 1):).
Это допустимо (любое выражение можно заключить в круглые скобки), но в данном контексте они совершенно излишни. Кроме того, не заканчивайте все инструкции точками с запятой— это также вполне допустимо в языке Ру(Ьоп, но они совершенно бесполезны, если в каждой строке находится всего одна инструкция (конец строки обычно обозначает конец инструкции). И помните — не встраивайте инструкции присваивания в условные выражения циклов ия11е и не заключайте блоки в фигурные скобки () (вложенные блоки оформляются с помощью отступов). ° Вместо циклов зЬ11е и функции галде старайтесь использовать простые циклы гог.
Еще одно напоминание: простые циклы Гсг (например, Гог х 1я вес) практически всегда проще и выполняютсябыстрее, чем счетные циклы ил)1е или основанные на использовании функции галде. Так как в простых циклах го я извлечение элементов последовательностей производится внутренними механизмами интерпретатора, они выполняются, порой, в два раза быстрее, чем эквивалентные циклы илг1е. Избегайте искушения считать что-лнбо в циклах на языке Ру(Ьоп1 ° Будьте внимательны, выполняя присваивание изменяемых объектов. Об этом уже говорилось в главе 11: следует быть особенно внимательным при использовании изменяемых объектов в инструкциях множественного присваивания (з = Ь = []), а также в расширенных инструкциях присваивания (а а= [1, 2]).
В обоих случаях непосредственные изменения могут затронуть другие переменные. Более подробно об этом рассказывается в главе 11. ° Не ожидайте получения результатов от функций, выполняющих непосредственные изменения в объектах. Мы уже сталкивались с этим ранее: операции, выполняющие непосредственное изменение, такие как методы 11ы, зррепс и 1гвг. вогг, представленные в главе 8, не имеют возвращаемых значений (отличных от лоле), поэтому их следует вызывать без присваивания возвращаемого значения.
Начинающие программисты часто допускают ошибку, используя примерно такой программный код: ву1гв1 = ву11вг. арреяз(х), пытаясь получить результат метода аррелс, но в действительности в этом 379 В заключение случае в переменную ву1!в1 записывается ссылка на объект Коле, а не на измененный список (фактически такая инструкция ведет к полной потере ссылки на список).
Менее явный пример такой ошибки — когда выполняется попытка обойти элементы словаря в порядке сортировки. Очень часто можно увидеть, например, такой программный код: 1ог К зп В. Кеув(), вог1();. Он почти работает — метод Кеув создает список ключей, а метод вог1 упорядочивает его, но, так как метод вог1 возвращает объект Коле, цикл 1ог терпит неудачу, потому что, в конечном счете, выполняется попытка обойти элементы объекта Коле (который не является последовательностью). Этот алгоритм можно реализовать либо с помощью новой встроенной функции вог1еэ', которая возвращает отсортированный список, либо необходимо разделить вызовы методов на инструкции: Кв = В.
Кеув( ), затем Кв. вог1( ), и наконец 1ог К 1п Кв:. Это один из случаев, когда может потребоваться явный вызов метода Кеув для организации обхода элементов словаря в цикле вместо использования итераторов словарей, так как итераторы не выполняют сортировку. ° Всегда используйте круглые скобки при вызове функций. При вызове функций после их имен всегда следует добавлять круглые скобки независимо от наличия входных аргументов (например, вызов функции должен выглядеть как 1рпс1зоп( ), а не гппс1зоп).
В четвертой части книги вы узнаете, что функции — это простые объекты, которые могут выполнять специальную операцию — вызов— при обращении к имени с круглыми скобками. Похоже, что эта проблема наиболее часто возникает в классах при работе с файлами — нередко можно увидеть, как начинающие программисты пытаются оформить вызов метода как 1з1е, с1ове, а не как 111е. с1ове(). Поскольку обращение к имени метода без круглых скобок в языке Ру1)зоп считается допустимым, такая попытка не приводит к появлению ошибки, ио файл остается открытым! ° Не используйте расширения имен файлов в инструкциях 1врог1 и ге1оас.
Не указывайте полные пути к файлам и расширения в инструкциях 1врог1 (например, следует писать 1врог1 вог), а не ззрог1 вос. ру). (Начальные сведения о модулях приводились в главе 3, и мы будем еще обсуждать их в пятой части книги.) Так как помимо .ру имена файлов модулей могут иметь другие расширения (например, .рус), указание расширения не только является нарушением синтаксиса, но и вообще не имеет смысла.
Синтаксис определения пути зависит от типа платформы и определяется настройками параметра пути поиска модулей, а не инструкцией зврог1. В заключение В этой главе мы рассмотрели вопросы документирования программ, которые касаются как документации, которую мы пишем для наших собственных программ, так и документации к встроенным инструментам. 380 Глава 14. Документация Мы познакомились со строками документирования, с ресурсами, содержащими справочные руководства по языку Рубикон, и узнали, как с помощью функции Ле1р и веб-интерфейса РуПос получить доступ к дополнительной документации.
Так как это последняя глава в этой части книги, мы также рассмотрели наиболее часто встречающиеся ошибки, что должно помочь вам избежать их. В следующей части книги мы начнем применять полученные знания к более крупным программным конструкциям: к функциям. Однако, прежде чем двинуться дальше, проработайте упражнения к этой части, которые приводятся в конце главы.
Но перед этим ответьте на контрольные вопросы к главе. Закрепление пройденного Контрольные вопросы 1. Когда вместо комментариев, начинающихся с символа решетки, следует использовать строки документирования? 2. Назовите три способа извлечения строк документирования. 3. Как получить перечень всех атрибутов объекта? 4. Как можно получить перечень всех модулей, доступных на компьютере? 5. Какие книги о РуФЪоп, после этой, следует приобрести? Ответы 1.
Строки документирования считаются более удобными для создания функционального описания, где поясняются принципы использования модулей, функций, классов и методов. Комментарии, начинающиеся с символа решетки, лучше подходят для пояснений к выражениям и инструкциям. Такой порядок принят не только потому, что строки документирования проще отыскать в файле с исходными текстами, но и потому, что они могут извлекаться и просматриваться с помощью системы РуПос.
2. Получить содержимое строк документирования можно с помощью атрибута т1ос объекта, передав его функции Ле1р, или выбирая модули в поисковой системе РуПос с графическим интерфейсом, в режиме клиент/сервер. Дополнительно РуПос обладает возможностью сохранять описание модулей в файлах НТМЬ для последующего просмотра. 3. Список всех атрибутов, имеющихся у любого объекта, можно получить с помощью функции О1г(Х). 4. Запустите графический интерфейс Руйос, оставьте пустым поле ввода имени модуля и щелкните на кнопке» ореп Ъготаэег» (открыть ЗВ1 Закрепление пройденного броузер).