Как разработать качественный код Python

Рабочие процессы и инструменты разработки

Бенджамин Бенгфорт

Разработка на Python сильно отличается от разработки на других языках. Python - это интерпретируемый язык, такой как Ruby или Perl, поэтому разработчики могут использовать циклы чтения-оценки-печати (REPL) для выполнения Python в режиме реального времени. Эта особенность Python означает, что его можно использовать для быстрой разработки и создания прототипов, потому что нет процесса сборки. Python включает в себя множество инструментов функционального программирования, схожих с Scala или Javascript, чтобы помочь в разработке сценариев на основе замыканий. Но Python - это также полностью масштабируемый объектно-ориентированный язык, парадигма, используемая для создания большого модульного программного обеспечения, а не просто для выполнения сценариев, более похожих на Java или C ++.

Питон находится в центре этих парадигм, обеспечивая лучшее из многих миров. Python используется для написания быстрых одноразовых скриптов, крупномасштабных веб-фреймворков, таких как Django, обработки данных с помощью Celery, даже для численных и научных вычислений. Python легок, стандартен во многих операционных системах и эффективен, что делает его лучшим выбором для исследователей данных и аналитиков для задач разработки и анализа данных.

Однако широта Python означает, что нет единого рабочего процесса для разработки с ним, и, конечно, нет стандартной среды IDE или среды для принятия этих решений от вашего имени. Большинство учебных материалов Python посвящены аспектам языка, связанным с написанием сценариев, и не учитывают важные детали создания больших проектов. Этот пост будет посвящен вопросу о том, как разработчик взаимодействует с Python для создания больших приложений данных.

Среда разработки

Итак, что вам нужно для успешной разработки приложений с данными на Python? Все, что вам нужно, это:

  1. Работает текстовый редактор - Sublime, Notepad ++, Vim, Emacs и Text Wrangler.
  2. Терминал с исполняемым файлом Python на вашем пути.

Это оно! Существует много сред разработки для использования Python, которые добавляют дополнительные инструменты в ваш рабочий процесс, включая отладчики, завершение кода и подсветку синтаксиса. Однако, когда дело доходит до этого, эти программы просто обертывают базовый текстовый редактор и терминал вместе с некоторыми дополнительными функциями. Если вы должны использовать IDE, я бы предложил следующее:

  1. IDLE - эта среда будет знакома пользователям Windows, которые, вероятно, выполнили в ней свои первые команды Python. Это очень просто, но это по умолчанию и эффективно.
  2. Komodo Edit - эта бесплатная IDE для Python написана ActiveState и предоставляет множество инструментов и функций.
  3. PyCharm - эта IDE не является бесплатной, но предоставляет IntelliJ-подобный опыт.
  4. Aptana Studio - Aptana имеет некоторую встроенную поддержку Python и фокусируется на сети.
  5. Spyder - студия Python специально для научных вычислений.
  6. iPython - интерактивная среда разработки, которая позволяет создавать блокноты для представления кода и данных Python.

Однако даже при использовании одного из этих инструментов вы все равно, вероятно, будете использовать базовый рабочий процесс, описанный ниже. Многие профессиональные разработчики Python довольны Sublime Text 3 его тонко мощными функциями и подсветкой синтаксиса в сочетании с pdb и командной строкой. Это то, что я делаю, и это позволит вам действительно развиваться!

По мере роста ваших проектов вы также захотите включить в свой рабочий процесс следующие инструменты:

  1. Git / Github.com - хранилище кода, но с Github, также трекером и вики.
  2. pip - менеджер пакетов python для установки сторонних инструментов.
  3. virtualenv и virtualenvwrapper - управляют виртуальными средами для разработки.

Существует много инструментов, помогающих в разработке программного обеспечения, но эти три инструмента являются важной частью современной разработки на Python и будут обсуждаться далее в оставшейся части этого поста.

Сторонние библиотеки

Разрабатывая код Python, вы неизбежно начнете включать сторонние пакеты, особенно если вы занимаетесь наукой о данных и нуждаетесь в таких инструментах, как Numpy, Pandas и другие. Сборка этих сторонних библиотек и установка их в вашей системе обычно выполняется с помощью pip - менеджера пакетов python. Убедитесь, что в вашей системе установлен pip, это сэкономит вам много времени и усилий!

Чтобы установить библиотеку Python request.py, простую библиотеку HTTP, которая позволяет очень легко извлекать данные из Интернета, вам нужно просто выполнить следующую команду:

запросы на установку $ pip

Удаление и управление пакетами, включая обновление, также включены в команду pip. С помощью pip freeze вы также можете получить список пакетов Python сторонних производителей, которые вы установили в своей системе. Чтобы найти различные библиотеки для использования в вашем коде, см. Индекс пакетов Python (PyPI).

Виртуальные среды

Когда вы начнете разрабатывать больше кода, вы начнете обнаруживать, что конкретные версии инструментов или инструментов, которые сложно создавать и поддерживать, необходимы для конкретных проектов и что они конфликтуют с версиями программного обеспечения в других проектах. Даже Python может стать проблемой, если вы разрабатываете для Python 2 и 3 в зависимости от среды развертывания! Еще более тревожно то, что Python также является критически важным аспектом многих операционных систем, существует (небольшая) вероятность, что вы можете в конечном итоге сломать системный Python во время разработки!

Решением этих проблем является использование virtualenv для упаковки полной среды разработки с вашим кодом. Virtualenv позволяет вам создать каталог, содержащий проектную версию Python, pip и все сторонние зависимости. Virtualenv может быть активирован и деактивирован в командной строке, что позволяет вам создать автономную среду. Более того, его можно использовать для создания сред, соответствующих вашей производственной среде (обычно это сервер Linux).

Virtualenvwrapper - это еще одна библиотека, которая позволяет вам управлять несколькими виртуальными средами и связывать их с конкретными проектами. Этот инструмент также быстро станет необходимым для вашего рабочего процесса. Чтобы установить virtualenv и virtualenvwrapper, используйте следующий код:

$ pip install virtualenv virtualenvwrapper

Затем отредактируйте ваш .profile в вашем домашнем каталоге и добавьте в конец следующее:

export WORKON_HOME = $ HOME / .virtualenvs
export PROJECT_HOME = $ HOME / Проекты
источник /usr/local/bin/virtualenvwrapper.sh

Все ваши виртуальные среды будут храниться в скрытом каталоге под названием virtualenvs, а в каталоге вашего проекта вы будете хранить свой код. Мы обсудим это подробнее в следующем разделе. Я также называю многие из сценариев virtualenv, чтобы с ними было легче работать, мои расширения вы можете увидеть в шпаргалке Бена VirtualEnv.

Примечание: пользователям Windows, возможно, придется следовать инструкциям для конкретной ОС, которые я с удовольствием обновлю и включу в этот пост.

Рабочий процесс создания кода

Создание и выполнение кода Python выполняется по двум различным шаблонам рабочих процессов.

  1. Создайте код в текстовом файле и выполните его с помощью Python
  2. Создайте код в текстовом файле и импортируйте его в Python REPL.

Вообще говоря, разработчики делают оба. Программы на Python предназначены для выполнения в командной строке через двоичный файл python, и обычно выполняется точка входа в гораздо большую библиотеку кода, которая импортируется. Разница между импортом и выполнением невелика, но по мере того, как вы делаете больше Python, он становится все более важным.

Используя любой из этих рабочих процессов, вы создаете свой код как можно более модульно, и в процессе создания вы выполняете его одним из методов, описанных выше, чтобы проверить его работоспособность. Большинство разработчиков Python переключаются между своим терминалом и редактором и могут проводить детальное тестирование каждой отдельной строки кода в процессе написания. Это аспект быстрого прототипирования в Python.

Итак, начнем с простого примера.

  1. Откройте окно терминала (смотрите инструкции к вашей конкретной операционной системе).
  2. ПРИМЕЧАНИЕ. Команды находятся в bash (Linux / Mac) или Windows Powershell.
  3. Создайте рабочее пространство для себя. В этом смысле рабочее пространство - это просто пустой каталог, где вы можете начать готовиться к работе по разработке. Вы, вероятно, также должны хранить свои различные проекты (здесь, синоним рабочего пространства) в их собственном каталоге, а пока мы просто назовем его «Проекты» и предположим, что он находится в вашем домашнем каталоге. Наш первый проект будет называться «myproject», но вы бы просто назвали его как хотите.
$ cd ~ / Проекты
$ mkdir myproject
$ cd myproject

Давайте создадим наш первый скрипт на Python. Вы можете либо открыть свой любимый редактор и сохранить файл в рабочей области (каталог ~ / Projects / myproject), либо вы можете коснуться его и затем открыть этот файл в своем редакторе.

$ touch foo.py

СОВЕТ ПРОФЕССИОНАЛА: если вы используете Sublime Text 3 и у вас установлен инструмент командной строки subl (см. Инструкции по установке Sublime Text), вы можете использовать следующую команду, чтобы открыть текущий каталог в редакторе:

$ subl. &

Я использую это так много, что присвоил команду e.

Итак, вот где вы должны быть: у вас должен быть текстовый редактор, открытый и редактирующий файл в ~ / Projects / myproject / foo.py, и у вас должно быть открыто окно терминала с текущим рабочим каталогом ~ / Projects / myproject. Теперь вы готовы развиваться. Добавьте следующий код в foo.py:

#! / usr / bin / env python
импорт CSV

набор данных def (путь):
    с открытым (путь, 'rU') в качестве данных:
        reader = csv.reader (данные)
        для строки в читателе:
            строка [2] = int (строка [2])
            ряд доходности

Этот код очень прост. Он просто реализует функцию, которая принимает путь и возвращает итератор, чтобы вы могли получить доступ к каждой строке CSV-файла, а также преобразовывать третий элемент в каждой строке в целое число.

PRO TIP: #! Строка (произносится как «шебанг») должна появляться в самом начале исполняемого скрипта Python, и перед ней ничего не должно быть. Он сообщит вашему компьютеру, что это файл Python, и правильно выполнит скрипт, если он запускается из командной строки как отдельное приложение. Эта строка не должна появляться в библиотечных модулях, то есть в коде Python, который вы планируете импортировать, а не выполнять.

Создайте некоторые данные, чтобы мы могли использовать нашу функцию. Давайте сохраним все наши данные в каталоге фикстур в нашем проекте.

$ mkdir fixtures
$ touch fixtures / calories.csv

Используя ваш редактор, добавьте эти данные в файл calories.csv:

сливочного масла, столовая ложка, 102
сыр чеддер, ломтик 113
цельное молоко, чашка, 148
гамбургер, элемент, 254

Хорошо, теперь пришло время использовать наш код. Сначала попробуем выполнить код в интерпретаторе. Откройте REPL следующим образом:

$ python
>>>

Теперь вы должны получить приглашение Python (>>>). Все, что вы вводите сейчас, должно быть на Python, а не на bash. Всегда обращайте внимание на подсказки в инструкции. Подсказка с $ означает ввод в командной строке инструкций (bash), подсказка, которая говорит, что >>> означает ввод Python в REPL, и если подсказка отсутствует, вы, вероятно, редактируете файл. Импортируйте ваш код:

>>> из набора данных импорта foo
>>> для строки в наборе данных ('fixtures / calories.csv'):
... печать строки [0]
масло сливочное
сыр чеддер
цельное молоко
гамбургер
>>>

Здесь много чего произошло, так что давайте посмотрим. Во-первых, когда вы импортировали функцию набора данных из foo, Python заглянул в ваш текущий рабочий каталог и нашел файл foo.py, и именно там он импортировал его. Где вы находитесь в командной строке и каков ваш путь к Python!

Когда вы импортируете функцию набора данных так, как мы это делали, модуль загружается и выполняется одновременно и передается в пространство имен интерпретатора. Теперь вы можете использовать его, написав цикл for, чтобы пройти через каждую строку и напечатать первый элемент. Обратите внимание на ... подсказку. Это означает, что Python ожидает блок с отступом. Чтобы выйти из блока, дважды нажмите Enter. Результаты печати отображаются прямо на экране, а затем вы возвращаетесь к приглашению.

Но что, если вы сделаете изменение в коде, например, с заглавной буквы первой буквы слов в первом элементе каждой строки? Изменения, которые вы записали в свой файл, не будут отображаться в REPL. Это потому, что Python уже загрузил код один раз. Чтобы получить изменения, вы должны либо выйти из REPL и перезапустить, либо импортировать другим способом:

>>> импорт фу
>>> для строки в foo.dataset ('fixtures / calories.csv'):
...

Теперь вы можете перезагрузить модуль foo и получить изменения кода:

>>> перезагрузить (foo)

Это может быть довольно громоздким, так как код становится больше и происходит больше изменений, поэтому давайте перенесем нашу стратегию разработки на выполнение файлов Python. Внутри foo.py добавьте следующее в конец файла:

если __name__ == '__main__':
    для строки в наборе данных ('fixtures / calories.csv'):
        строка печати [0]

Чтобы выполнить этот код, просто введите в командной строке следующее:

$ python foo.py
масло сливочное
сыр чеддер
цельное молоко
гамбургер

Оператор if __name__ == '__main__': означает, что код будет выполняться только в том случае, если код выполняется напрямую, а не импортируется. Фактически, если вы откроете REPL и введете import foo, на ваш экран ничего не будет выведено. Это невероятно полезно. Это означает, что вы можете поместить тестовый код в ваш скрипт при его разработке, не беспокоясь о том, что он помешает вашему проекту. Мало того, он документирует другим разработчикам, как использовать код в этом файле, и предоставляет простой тест, чтобы убедиться, что вы не создаете ошибок.

В более крупных проектах вы увидите, что большинство разработчиков помещают код тестирования и отладки в так называемые операторы ifmain внизу своих файлов. Вы должны сделать это тоже!

Надеемся, что в этом примере вы изучили рабочий процесс разработки программ на Python, выполняя сценарии и используя «ifmain», а также импортируя и загружая сценарии в REPL. Большинство разработчиков используют оба метода взаимозаменяемо, используя все, что нужно в данный момент.

Структурирование крупных проектов

Итак, как вы пишете настоящую программу на Python и переходите от экспериментов с короткими фрагментами кода к более крупным программам? Первое, что вам нужно сделать, это организовать свой код в проект. К сожалению, в действительности нет ничего, чтобы сделать это для вас автоматически, но большинство разработчиков следуют хорошо известному шаблону, который был представлен Зедом Шоу в его книге «Изучите Python - трудный путь».

Чтобы создать новый проект, вы реализуете «скелет проекта Python», набор каталогов и файлов, которые принадлежат каждому создаваемому вами проекту. Скелет проекта очень знаком разработчикам Python, и вы быстро начнете распознавать его, изучая код других разработчиков Python (что вам и следует делать). Основной скелет реализован внутри директории проекта, которая хранится в вашем рабочем пространстве, как описано выше. Структура каталогов выглядит следующим образом (для примера проекта myproject):

$ myproject
,
├── README.md
├── LICENSE.txt
Requirements── needs.txt
Setup── setup.py
Bin── бен
| My── myapp.py
├── документы
| Bu── _build
| Conf── conf.py
| Index── index.rst
| Make── Makefile
├── Светильники
Oo── foo
| └── __init__.py
Tests── тесты
    └── __init__.py

Это много, но не пугайтесь. Эта структура реализует множество инструментов, включая упаковку для распространения, документацию по Sphinx, тестирование и многое другое.

Давайте пройдемся по кусочкам один за другим. Проектная документация - это первая часть, реализованная в виде файлов README.md и LICENSE.txt. Файл README - это документ с уценкой, который вы можете добавить в свой проект для разработчика. ЛИЦЕНЗИЯ может быть любой лицензией с открытым исходным кодом или заявлением об авторском праве в случае проприетарного кода. Оба этих файла обычно создаются для вас, если вы создаете свой проект в Github. Если вы создаете свой файл в Github, вам также следует использовать Python .gitignore, который предоставляет Github, что помогает поддерживать чистоту ваших репозиториев.

Сценарий setup.py - это скрипт установки Python setuptools или distutils, который позволяет настроить проект для развертывания. Он будет использовать файл require.txt, чтобы указать сторонние зависимости, необходимые для реализации вашего проекта. Другие разработчики также будут использовать эти файлы для создания своих сред разработки.

Каталог docs содержит генератор документации Sphinx, документация Python написана в restructuredText, язык разметки, аналогичный Markdown и другим. Эта документация должна быть более обширной и должна быть как для пользователей, так и для разработчиков. Каталог bin будет содержать любые исполняемые скрипты, которые вы намереваетесь создать. Ученые, работающие с данными, также обычно имеют каталог приспособлений для хранения файлов данных.

Каталоги foo и tests на самом деле являются модулями Python, поскольку они содержат файл __init__.py. Вы поместите свой код в foo, а ваши тесты в тесты. Как только вы начнете разрабатывать внутри своего каталога foo, обратите внимание, что когда вы открываете REPL, вы должны импортировать все из пространства имен 'foo'. Вы можете поместить операторы импорта в свои файлы __init__.py, чтобы упростить импорт. Вы также можете выполнять свои скрипты в каталоге foo, используя метод «ifmain».

Настройка вашего первого проекта

Вам не нужно вручную создавать структуру выше, многие инструменты помогут вам создать эту среду. Например, проект Cookiecutter поможет вам управлять шаблонами проектов и быстро создавать их. Команда spinx-quickstart создаст каталог вашей документации. Github добавит заглушки README.md и LICENSE.txt. Наконец, pip freeze сгенерирует файл needs.txt.

Однако запуск проекта Python - это ритуал, поэтому я проведу вас через процесс его запуска. Зажги свечу, закатай рукава и выпей кофе. Пора.

Внутри вашего каталога Projects создайте каталог для вашего рабочего пространства (проекта). Давайте представим, что мы создаем проект, который будет генерировать социальную сеть из электронных писем, мы будем называть это «emailgraph».

$ mkdir ~ / Проекты / emailgraph
$ cd ~ / Проекты / emailgraph

Инициализируйте ваш репозиторий с помощью Git.

$ git init

Инициализируйте ваше virtualenv с помощью оболочки virtualenv.

$ mkvirtualenv -a $ (pwd) emailgraph

Это создаст виртуальную среду в ~ / .virtualenvs / emailgraph и автоматически активирует ее для вас. В любое время и в любом месте командной строки вы можете выполнить команду workon emailgraph, и вы попадете в каталог вашего проекта (флаг -a указывает, что это каталог проекта для этого virtualenv).

Создайте различные каталоги, которые вам потребуются:

(emailgraph) $ mkdir bin тестирует светильники emailgraph docs

А затем создайте необходимые файлы:

(emailgraph) $ touch tests / __ init__.py
(emailgraph) $ touch emailgraph / __ init__.py
(emailgraph) $ touch setup.py README.md LICENSE.txt .gitignore
(emailgraph) $ touch bin / emailgraph-admin.py

Создайте документацию с помощью sphinx-quickstart:

(emailgraph) $ sphinx-quickstart

Вы можете безопасно использовать значения по умолчанию, но убедитесь, что вы в конце принимаете Makefile, чтобы быстро и легко генерировать документацию. Это должно создать файл index.rst и conf.py в вашем каталоге документов.

Установите нос и покрытие, чтобы начать тестирование:

(emailgraph) $ pip install покрытие носа

Откройте файл tests / __ init__.py в своем любимом редакторе и добавьте следующие тесты инициализации:

импортный тест

Класс InitializationTests (unittest.TestCase):

    def test_initialization (self):
        «»»
        Проверьте выполнение набора тестов, подтвердив 2 + 2 = 4
        «»»
        self.assertEqual (2 + 2, 4)

    def test_import (self):
        «»»
        Убедитесь, что тестовый набор может импортировать наш модуль
        «»»
        пытаться:
            импортировать emailgraph
        кроме ImportError:
            self.fail («Не удалось импортировать граф электронной почты»)

Теперь вы можете запустить набор тестов из каталога проекта со следующим охватом:

(emailgraph) $ nosetests -v --with-cover --cover-package = emailgraph \
              --cover-inclusive --cover-erase тесты

Вы должны увидеть два теста, проходящих вместе с отчетом о покрытии 100% тестов.

Откройте файл setup.py и добавьте следующие строки:

#! / usr / bin / env python
поднять NotImplementedError («Установка еще не реализована.»)

Настройка приложения для развертывания - тема другого поста, но это предупредит других разработчиков о том, что вы еще не дошли до него.

Создайте файл needs.txt с помощью pip freeze:

(emailgraph) $ pip freeze> needs.txt

Наконец, зафиксируйте всю работу, которую вы проделали, чтобы отправить график в репозиторий.

(emailgraph) $ git add --all
(emailgraph) $ git status
На ветке мастер

Начальный коммит

Изменения должны быть совершены:
  (используйте "git rm --cached  ..." для удаления)

    новый файл: LICENSE.txt
    новый файл: README.md
    новый файл: bin / emailgraph-admin.py
    новый файл: docs / Makefile
    новый файл: docs / conf.py
    новый файл: docs / index.rst
    новый файл: emailgraph / __ init__.py
    новый файл: needs.txt
    новый файл: setup.py
    новый файл: tests / __ init__.py

(emailgraph) $ git commit -m "Начальная настройка репозитория"

После этого ваш проект должен быть полностью настроен и готов к работе. Выпей еще кофе, пора начинать работать!

Заключение

Надеемся, что в этом посте вы познакомились с лучшими практиками и рабочими процессами для разработки на Python. Структурирование вашего кода и проектов таким образом поможет вам упорядочиться, а также поможет другим быстро понять, что вы создали, что очень важно при работе над проектами, в которых участвует более одного человека. Что еще более важно, эта структура проекта является подготовкой к развертыванию и основой для более крупных приложений и профессионального программного обеспечения промышленного уровня. Если вы пишете сценарии или пишете приложения, я надеюсь, что эти рабочие процессы будут полезны.

Если вы хотите больше узнать о том, как включить инструменты профессионального уровня в разработку Python, ознакомьтесь с некоторыми из следующих инструментов:

  • Travis-CI - это сервис непрерывной интеграции, который автоматически запускает ваш тестовый жгут, когда вы переходите на Github. Это обеспечит прохождение всех ваших тестов, прежде чем вы начнете работать!
  • Waffle.io превратит ваши проблемы с Github в полноценную Agile доску, позволяющую отслеживать вехи и спринты, а также лучше координировать вашу команду.
  • Pylint автоматически проверит наличие хороших стандартов кодирования, обнаружение ошибок и даже нарисует UML-диаграммы для вашего кода!

Дополнительное чтение

  • Изучите Python трудный путь
  • Изучение Python, 5-е издание
  • Программирование Python
  • Практическая книга по науке о данных

District Data Labs предоставляет консалтинговые услуги в области данных и корпоративное обучение. Мы работаем с компаниями и командами всех размеров, помогая им сделать свои операции более управляемыми данными и расширяя аналитические способности своих сотрудников. Заинтересованы в сотрудничестве с нами? Дайте нам знать!