Чистыйкод дляпродолжающи х
Скачать 7.85 Mb.
|
Избегайте лишних разговоров, предоставляйте информацию заранее Если вы обращаетесь к кому-то лично, фраза «Можно ли задать вам вопрос?» станет коротким и любезным способом узнать, доступен ли адресат. Но на интернет-фору- мах эксперт может ответить не сразу, а тогда, когда у него появится время. Так как переписка иногда растягивается на часы, лучше предоставить всю информацию, которая может понадобиться, в исходном сообщении, а не спрашивать каждый раз разрешения задать вопрос. Если вам не ответили, стоит скопировать эту информацию на другой форум. Формулируйте свой вопрос как вопрос Когда вы объясняете свою проблему, иногда возникает иллюзия, что эксперты уже знают, о чем идет речь. Но программирование — весьма обширная область; может оказаться, что у них нет опыта конкретно в той области, которая интересует вас. По- этому так важно сформулировать ваш вопрос в форме вопроса. Хотя предложения, начинающиеся со слов «Мне хотелось бы…» или «Мой код не работает…», могут намекать на суть, обязательно задайте конкретный вопрос — то есть буквально предложение, завершающееся вопросительным знаком. В противном случае может быть непонятно, о чем вы спрашиваете. Задавайте вопросы на подходящем веб-сайте Если вы начнете спрашивать о Python на форуме JavaScript или об алгоритмах — в списке рассылки, посвященном сетевой безопасности, вряд ли это принесет пользу. В большинстве случаев в списках рассылки и интернет-форумах имеется перечень часто задаваемых вопросов (FAQ) или описание обсуждаемых тем. На- пример, список рассылки python-dev посвящен проектированию языка Python и не является общим списком рассылки для получения помощи. Веб-страница https://www.python.org/about/help/ поможет вам найти подходящий ресурс для запроса о языке Python. Включите краткое описание вопроса в заголовок Одно из главных преимуществ публикации вопроса на интернет-форуме заклю- чается в том, что тот, у кого тот же вопрос возникнет позже, сможет найти ответ при помощи поиска в интернете. Обязательно включите заголовок с кратким описанием вопроса, чтобы упростить работу поисковых систем. Заголовок типа «Помогите, пожалуйста» или «Почему мой код не работает?» слишком неопре- деленный. Если вы просите совета по электронной почте, информация в стро- ке — это то, на что эксперт обратит внимание, когда будет просматривать папку входящих сообщений. Как обратиться за помощью по программированию 35 Объясните, что должен делать ваш код В вопросе «Почему моя программа не работает?» отсутствует важнейшая инфор- мация: что должна делать ваша программа. А тот, кто прочитает вопрос, не знает ваших намерений. Даже в формулировке «Почему я получаю эту ошибку?» по- лезно указать конечную цель вашей программы. В некоторых случаях вам могут ответить, что вы выбрали не тот путь и вам проще начать все заново, вместо того чтобы тратить время на попытки что-то исправить. STACK OVERFLOW И ПОСТРОЕНИЕ АРХИВА ОТВЕТОВ Stack Overflow — популярный веб-сайт для получения ответов на вопросы по программированию, но многие новички опасаются пользоваться им. Извест- но, что модераторы Stack Overflow безжалостно закрывают вопросы, которые не соответствуют их строгим рекомендациям. Тем не менее существует веская причина для поддержания столь жесткой дисциплины на Stack Overflow. Сайт создавался не столько для получения ответов на вопросы, сколько для построения архива вопросов по программированию вместе с ответами на них. Как следствие, вопросы должны быть конкретными, уникальными и не основанными на субъективных мнениях. Кроме того, они должны быть по- дробными и хорошо сформулированными, чтобы пользователям поисковых систем было проще найти их. (Ситуация для программистов до появления Stack Overflow легла в основу юмористического комикса XKCD «Wisdom of the Ancients» по адресу https://xkcd.com/979/.) Тридцать ответов на один и тот же вопрос не только неэффективно расходуют усилия добровольных экс- пертов с сайта, но сбивают с толку пользователей поисковых систем множе- ственными результатами. Вопросы должны иметь конкретные, объективные ответы. Ответ на вопрос «Какой самый лучший язык программирования?» является делом вкуса, он только порождает лишние споры. (Ведь мы уже знаем, что лучший язык программирования — Python.) Тем не менее неприятно, когда ваш вопрос игнорируют, не ответив. Я реко- мендую внимательно прочитать советы этой главы и руководство «How do I ask a good question?» на сайте Stack Overflow по адресу https://stackoverflow. com/help/how-to-ask/. Поэтому не стесняйтесь использовать псевдоним, если боитесь задать «глупый» вопрос. Stack Overflow не требует указывать настоящие имена для своих учетных записей. Если вы предпочитаете более непринужденную обстановку, возможно, вам стоит обратиться на страницу https://reddit.com/r/learnpython/ — это сообщество не так строго относится к вопросам. Тем не менее обязательно прочитайте рекомендации, прежде чем писать на сайт. 36 Глава 1.Обработка ошибок и обращение за помощью Включите полное сообщение об ошибке Не забудьте скопировать все сообщение об ошибке, включая трассировку. Простое описание вроде «Получаю ошибку выхода за границы диапазона» не содержит до- статочной информации, чтобы эксперт смог понять, что же пошло не так. Также укажите, всегда ли вы получаете ошибку или проблема возникает эпизодически. Если вы выявили конкретные обстоятельства, в которых происходит ошибка, стоит и их включить в описание. Приведите полный код Наряду с полным сообщением об ошибке и трассировкой предоставьте исходный код всей программы. В этом случае эксперт, у которого вы просите помощь, смо- жет запустить программу на своей машине в отладчике и посмотреть, что в ней происходит. Всегда приводите минимальный, полный и воспроизводимый (MCR — Minimum, Complete, Reproducible) пример, надежно воспроизводящий полученную ошибку. Термин MCR возник при обсуждениях на сайте Stack Overflow, подробнее о нем — на странице https://stackoverflow.com/help/mcve/. «Минимальный» означает, что ваш код должен быть по возможности коротким, но при этом воспроизводить возникшую проблему. «Полный» — что пример кода содержит все необходимое для воспроизведения ошибки. «Воспроизводимый» означает, что ваш пример кода надежно воспроизводит описанную проблему. Но если вся ваша программа содержится в одном файле, отправить ее помощнику будет несложно. Только проследите за тем, чтобы она была правильно отформати- рована — об этом в следующем разделе. Правильно отформатируйте свой код Вы публикуете свой код, чтобы эксперт мог прочитать вашу программу и воспро- извести ошибку. Но помните, что код должен быть правильно отформатирован. Убедитесь, что ваш адресат сможет легко скопировать код и запустить его в том виде, в котором вы его публикуете. Если вы копируете свой код в сообщение электронной почты, учтите, что многие почтовые клиенты удаляют отступы, и ваш код будет выглядеть так: def knuts(self, value): if not isinstance(value, int) or value < 0: raise WizCoinException('knuts attr must be a positive int') self._knuts = value Мало того что эксперту придется потратить время на вставку отступов в каждой строке программы; трудно с ходу сказать, каким отступом должна начинаться каж- дая строка. Чтобы обеспечить правильное форматирование кода, скопируйте его Как обратиться за помощью по программированию 37 на веб-сайт pastebin (например, https://pastebin.com/ или https://gist.github.com/), который сохраняет ваш код с коротким общедоступным URL-адресом (например, https://pastebin.com/XeU3yusC). Передать URL намного проще, чем использовать вложенный файл. Если вы публикуете свой код на веб-сайте (например, https://stackoverflow.com/ или https://reddit.com/r/learnpython/), обязательно используйте средства форматирования в его текстовых полях. Часто при создании отступа из четырех пробелов в строке ис- пользуется моноширинный программный шрифт, который проще читать. Также стоит заключить текст в символы ` (обратный апостроф), чтобы оформить код программ- ным шрифтом. Такие сайты часто включают ссылку на информацию форматирования. Если вы не будете соблюдать эти рекомендации, это может привести к нарушению форматирования исходного кода, отчего он будет выводиться в одной строке: def knuts(self, value):if not isinstance(value, int) or value < 0:raise WizCoinException('knuts attr must be a positive int') self._knuts = value Также не передавайте свой код на снимках экрана; не пытайтесь сфотографировать экран и отправить изображение. Скопировать код из графического изображения невозможно, к тому же обычно он плохо читается. Сообщите, что вы уже пытались сделать Сообщите в вопросе, что вы уже пытались сделать и что у вас получилось в резуль- тате. Эта информация избавит эксперта от напрасных попыток пройти по ложному следу, а заодно покажет, что вы прилагали усилия, чтобы решить свою проблему. Кроме того, так вы продемонстрируете, что обращаетесь за помощью, а не просите других написать программу за вас. К сожалению, нередко студенты просят незна- комых людей в интернете сделать за них домашнюю работу, или предприниматели уговаривают кого-то бесплатно написать «простое приложение». Форумы про- граммистов создаются не для этого. Опишите свою рабочую конфигурацию Конфигурация вашего компьютера может повлиять на то, как работает ваша про- грамма и какие ошибки она выдает. Чтобы эксперт мог воспроизвести вашу про- блему на своем компьютере, предоставьте следующую информацию. Операционная система и ее версия (например, Windows 10 Professional Edition или macOS Catalina). Версия Python, использованная для запуска программы (например, Python 3.7 или Python 3.6.6). 38 Глава 1.Обработка ошибок и обращение за помощью Сторонние модули, использованные в программе, и их версии (например, Django 2.1.1). Чтобы узнать номера версий установленных сторонних модулей, выполните команду pip list . Номер версии принято включать в атрибут __version__ , как в следующем примере: >>> import django >>> django.__version__ '2.1.1' Скорее всего, эта информация не потребуется. Но чтобы избежать лишних вопро- сов, все равно включите эту информацию в исходный пост. Примеры вопросов Ниже приведен пример правильно заданного вопроса, который отвечает всем ре- комендациям из предыдущего раздела: « Selenium Webdriver: как мне найти ВСЕ атрибуты элемента? В модуле Python Selenium, если у меня есть объект WebElement , я могу получить значение любого из его атрибутов вызовом get_attribute() : foo = elem.get_attribute('href') Если атрибут с именем 'href' не существует, возвращается None Вопрос: как получить список всех атрибутов, имеющихся у элемента? Я не на- шел ничего похожего на метод get_attributes() или get_attribute_names() Я использую версию 2.44.0 модуля Selenium для Python». Этот вопрос был взят со страницы https://stackoverflow.com/q/27307131/1893164/. Заголовок обобщает вопрос в одном предложении. Проблема сформулирована в виде вопроса и завершается вопросительным знаком. Если в будущем кто-нибудь прочитает этот заголовок в результатах поиска, он немедленно поймет, имеет это отношение к его проблеме или нет. Код выделен моноширинным программным шрифтом, а текст разбит на абзацы. С первого взгляда понятно, где в этом со- общении находится вопрос: перед ним даже стоит уточнение «Вопрос:». В тексте предполагается, что метод get_attributes() или get_attribute_names() мог бы присутствовать, но его нет. Также сообщается, что была предпринята попытка найти решение, и приводится предположение о том, как бы мог выглядеть пра- вильный ответ на вопрос. Кроме того, указана версия модуля Selenium на случай, Итоги 39 если она вдруг понадобится. Лучше привести слишком много информации, чем слишком мало. Итоги Независимый поиск ответов на вопросы из области программирования — самый важный навык, которым должен владеть каждый программист. Интернет был по- строен программистами, и в нем имеется множество ресурсов с ответами, которые вам нужны. Но сначала необходимо разобрать (часто невразумительные) сообщения об ошиб- ках, выдаваемые Python. Если вы не понимаете текст сообщения об ошибке — ничего страшного. Вы все равно можете передать этот текст поисковой системе, чтобы найти описание ошибки на нормальном языке и его наиболее вероятную причину. Трассировка ошибки сообщит, где в вашей программе возникла проблема. Статический анализатор способен в реальном времени находить опечатки и потен- циальные ошибки в процессе написания кода. Статические анализаторы абсолютно необходимы для современной разработки ПО. Если в вашем текстовом редакторе нет статического анализатора или возможности подключить его в виде плагина, подумайте о переходе на другой редактор, в котором такая возможность имеется. Если вам не удается найти решение проблемы в интернете, попробуйте опублико- вать вопрос на форуме или задайте вопрос эксперту по электронной почте. Чтобы повысить эффективность запроса, в этой главе я рассказал, как оформить «хоро- ший» вопрос по программированию. Задавайте конкретный, хорошо сформули- рованный вопрос, приведите полный исходный код и подробности сообщения об ошибке, объясните, что вы уже пытались сделать, и назовите используемую версию операционной системы и версию Python. Ответы не только решат вашу проблему, но будут полезны и тем, кто столкнется с той же проблемой в будущем. Не падайте духом, даже если вам приходится постоянно искать ответы и обра- щаться за помощью. Программирование — необъятная область, и никто не сможет держать в голове все нюансы. Даже опытные разработчики ежедневно обращаются к интернету за документацией и решениями. Приложите усилия, чтобы научиться искать решения — это поможет вам стать эффективным программистом Python. 2 Подготовка среды и командная строка Подготовкой среды называется процесс настройки вашего компьютера для программирования. Он включает установку всех необходимых инструментов, настройку их конфигура- ции и решение всех проблем, возникающих в процессе под- готовки. Единственно верного процесса не существует, потому что все используют разные компьютеры с разными операционными системами, версиями операционных систем и версиями интерпретатора Python. Тем не менее в этой главе описаны базовые концепции, которые помогут вам ад- министрировать ваш компьютер, используя командную строку, переменные среды и файловую систему. Изучение этих концепций и средств может показаться досадной помехой. Вы хотите писать программы, а не возиться с параметрами конфигурации или разбираться в невразумительных консольных командах. Но эти навыки сэкономят ваше время в долгосрочной перспективе. Если вы будете игнорировать сообщения об ошибках или наугад изменять конфигурацию, чтобы ваша система делала то, что нужно, вам удастся замаскировать проблему, но не исправить ее. Но если вы не пожалеете времени и как следует научитесь решать такие задачи, вы сможете предотвратить возникновение проблем в будущем. Файловая система Файловая система используется операционной системой для хранения и чтения данных. Файл обладает двумя ключевыми свойствами: именем и путем. Путь за- дает местоположение файла на компьютере. Например, файл на моем ноутбуке с Windows 10 хранится под именем project.docx в C:\Users\Al\Documents (это и есть путь). Файловая система 41 Часть имени файла после последней точки называется расширением файла и сообщает его тип. Расширение в имени файла project.docx показывает, что это документ Word, а Users , Al и Documents обозначают названия папок (также называемых каталогами). Папки могут содержать файлы и другие папки. Например, файл project.docx хранится в папке Documents , которая находится в папке Al , которая в свою очередь помещена в папку Users На рис. 2.1 изображена структура папок. Рис. 2.1. Файл в иерархии папок Часть пути C:\ определяет корневую папку, которая содержит все остальные папки. В системе Windows корневой папке присваивается имя C:\ . Также корневую папку называют диском C:. В macOS и Linux корневая папка обозначается / . В этой книге я использую корневую папку для Windows — C:\ . Если вы будете вводить примеры в интерактивном сеансе macOS или Linux, укажите / Дополнительные тома — такие, как дисководы DVD или флеш-диски USB, по- разному представлены в разных операционных системах. В Windows — это новые корневые диски, обозначаемые другими буквами, например D:\ или E:\ . В macOS — это новые папки внутри папки /Volumes . В Linux — новые папки внутри папки /mnt (сокращение от mount). Учтите, что в Windows и macOS регистр символов в именах папок и файлов игнорируется, но в Linux он значим. Пути в Python В Windows для разделения имен папок и файлов используется символ \ (обратная косая черта), а в macOS и Linux разделителем является символ / (косая черта). Чтобы не держать в голове оба варианта для обеспечения межплатформенной со- вместимости сценариев Python, можно использовать модуль pathlib и оператор / 42 Глава 2.Подготовка среды и командная строка Для импортирования pathlib обычно используется команда from pathlib import Path . Так как из всех классов pathlib чаще всего применяется класс Path , эта форма позволяет использовать имя Path вместо pathlib.Path . Вы можете передать Path() строку с именем папки или файла, чтобы создать объект Path , представляющий эту папку или файл. Если крайний левый объект в выражении является объектом Path , оператор / может использоваться для сцепления объектов Path или строк. Введите следующие команды в интерактивной оболочке: >>> from pathlib import Path >>> |