Как правильно создать проект на python
Перейти к содержимому

Как правильно создать проект на python

  • автор:

Как создать свой первый open source проект на Python (17 шагов)

Каждый разработчик ПО должен знать как создать библиотеку с нуля. В процессе работы Вы можете многому научиться. Только не забудьте запастись временем и терпением.

Может показаться, что создать библиотеку с открытым исходным кодом сложно, но Вам не нужно быть потрепанным жизнью ветераном своего дела, чтобы разобраться в коде. Также как Вам не нужна мудреная идея продукта. Но точно понадобятся настойчивость и время. Надеюсь, что данное руководство поможет Вам создать первый проект с минимальной затратой и первого, и второго.

В этой статье мы пошагово разберем процесс создания базовой библиотеки на Python. Не забудьте заменить в приведенном ниже коде my_package, my_file и т.п. нужными вам именами.

Шаг 1: Составьте план

Мы планируем создать простую библиотеку для использования в Python. Данная библиотека позволит пользователю легко конвертировать блокнот Jupyter в HTML-файл или Python-скрипт.
Первая итерация нашей библиотеки позволит вызвать функцию, которая выведет определенное сообщение.

Теперь, когда мы уже знаем, что хотим делать, нужно придумать название для библиотеки.

Шаг 2: Дайте имя библиотеке

Придумывать имена сложно. Они должны быть короткими, уникальными и запоминающимися. Также они должны быть написаны строчными буквами, без прочерков и прочих знаков препинания. Подчеркивание не рекомендуется. В процессе создания библиотеки убедитесь, что придуманное Вами имя доступно на GitHub, Google и PyPi.

Если Вы надеетесь и верите, что однажды Ваша библиотека получит 10000 звезд GitHub, то стоит проверить, доступно ли данное имя в социальных сетях. В данном примере я назову свою библиотеку notebookc, потому что это имя доступное, короткое и более-менее описывает суть моей задумки.

Шаг 3. Настройте среду

Убедитесь, что у вас установлены и настроены Python 3.7, GitHub и Homebrew. Если вам нужно что-то из этого, вот подробности:

Python

Скачайте Python 3.7 здесь и установите его.

GitHub

Если у вас нет учетной записи GitHub, перейдите по этой ссылке и оформите бесплатную подписку. Посмотрите, как установить и настроить Git здесь. Вам потребуется утилита командной строки. Перейдите по ссылкам, скачайте и установите все, что Вам понадобится, придумайте юзернейм и укажите электронную почту.

Homebrew

Homebrew — менеджер библиотек для Mac. Инструкции по установке найдете здесь.

Venv

Начиная с Python 3.6 рекомендуется использовать venv для создания виртуальной среды для разработки библиотек. Существует множество способов управления виртуальными средами с помощью Python и все они со временем изменяются. Можете ознакомиться с обсуждением здесь, но, как говорится, доверяй, но проверяй.

Начиная с версии Python 3.3 venv входит в систему по умолчанию. Обратите внимание, что venv устанавливает pip и setuptools начиная с Python 3.4.

Создайте виртуальную среду Python 3.7 с помощью следующей команды:

python3.7 -m venv my_env

Замените my_env вашим именем. Активируйте среду таким образом:

Теперь вы должны наблюдать (my_env) (или имя, которое вы выбрали для вашей виртуальной среды) в крайнем левом углу терминала.

Когда закончите работу, деактивируйте виртуальную среду с помощью deactivate .

Теперь давайте настроим GitHub.

Шаг 4: Создайте организацию в GitHub

GitHub — лидер на рынке реестров контроля версий. Еще две популярные опции — GitLab и Bitbucket. В данном гиде мы будем использовать именно GitHub.

Вам придется часто обращаться к Git и GitHub, поэтому если Вы не знакомы с системой, то можете обратиться к моей статье.

Создайте новую организацию в GitHub. Следуйте инструкциям. Я назвал свою организацию notebooktoall. Вы можете создать репозиторий под своей личной учетной записью, но одна из целей работы — научиться создавать проект с открытым исходным кодом для более широкого сообщества.

image

Шаг 5: Настройте GitHub Repo

Создайте новый репозиторий. Я назвал свой notebookc.

image

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

Рекомендую выбрать лицензию в списке Выбрать лицензию. Она определяет, что могут делать пользователи Вашего репозитория. Одни лицензии позволяют больше других. Если Вы ничего не выбираете, то автоматически начинают действовать стандартные законы об авторских правах. Узнайте больше о лицензиях здесь.

Для этого проекта я выбрал третью версию Открытого лицензионного соглашения GNU, потому что она популярная, проверенная и “гарантирует пользователям свободу использования, изучения, обмена и изменения программного обеспечения” — источник.

image

Шаг 6: Клонируйте и добавьте директории

Выберите, куда Вы хотите клонировать Ваш репозиторий или выполните следующую функцию:

git clone https://github.com/notebooktoall/notebookc.git

Подставьте свою организацию и репозиторий.

Перейдите в папку проекта с помощью десктопного графического интерфейса или редактора кода. Или используйте командную строку с cd my-project и после просмотрите файлы с ls —A .

Ваши исходные папки и файлы должны выглядеть так:

.git
.gitignore
LICENSE
README.rst

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

Создайте файл с именем __init__.py в основной вложенной папке. Этот файл пока останется пустым. Он необходим для импорта файлов.

Создайте еще один файл с таким же именем, как у основной вложенной папки, и добавьте .py. Мой файл называется notebookc.py. Вы можете назвать этот Python-файл как захотите. Пользователи библиотеки при импорте модуля будут ссылаться на имя этого файла.

Содержимое моей директории notebookc выглядит следующим образом:

.git
.gitignore
LICENSE
README.rst
notebookc/__init__.py
notebookc/notebookc.py

Шаг 7: Скачайте и установите requirements_dev.txt

На верхнем уровне директории проекта создайте файл requirements_dev.txt. Часто этот файл называют requirements.txt. Назвав его requirements_dev.txt, Вы показываете, что эти библиотеки могут устанавливаться только разработчиками проекта.

В файле укажите, что должны быть установлены pip и wheel.

Обратите внимание, что мы указываем точные версии библиотек с двойными знаками равенства и полными номерами версии.

Закрепите версии вашей библиотеку в requirements_dev.txt

Соавтор, который разветвляет репозиторий проекта и устанавливает закрепленные библиотеки require_dev.txt с помощью pip, будет иметь те же версии библиотеки, что и Вы. Вы знаете, что эта версия будет работать у них. Кроме того, Read The Docs будет использовать этот файл для установки библиотек при сборке документации.

В вашей активированной виртуальной среде установите библиотеку в файл needs_dev.txt с помощью следующей команды:

pip install -r requirements_dev.txt

Настоятельно рекомендую обновлять эти библиотеки по мере выхода новых версий. На данный момент установите любые последние версии, доступные на PyPi.

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

Шаг 8: Поработайте с кодом

В целях демонстрации давайте создадим базовую функцию. Свою собственную крутую функцию сможете создать позже.

Вбейте следующее в Ваш основной файл (для меня это notebookc/notebookc/notebookc.py):

def convert(my_name): """ Print a line about converting a notebook. Args: my_name (str): person's name Returns: None """ print(f"I'll convert a notebook for you some day, .")

Вот наша функция во всей красе.

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

Шаг 9: Создайте setup.py

Файл setup.py — это скрипт сборки для вашей библиотеки. Функция setup из Setuptools создаст библиотеку для загрузки в PyPI. Setuptools содержит информацию о вашей библиотеке, номере версии и о том, какие другие библиотеки требуются для пользователей.

Вот мой пример файла setup.py:

from setuptools import setup, find_packages with open("README.md", "r") as readme_file: readme = readme_file.read() requirements = ["ipython>=6", "nbformat>=4", "nbconvert>=5", "requests>=2"] setup( name="notebookc", version="0.0.1", author="Jeff Hale", author_email="jeffmshale@gmail.com", description="A package to convert your Jupyter Notebook", long_description=readme, long_description_content_type="text/markdown", url="https://github.com/your_package/homepage/", packages=find_packages(), install_requires=requirements, classifiers=[ "Programming Language :: Python :: 3.7", "License :: OSI Approved :: GNU General Public License v3 (GPLv3)", ], )

Обратите внимание, что long_description установлен на содержимое файла README.md. Список требований (requirements), указанный в setuptools.setup.install_requires, включает в себя все необходимые зависимости для работы вашей библиотеки.

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

Ограничьте список install_requires только тем, что Вам надо — Вам не нужно, чтобы пользователи устанавливали лишние библиотеки. Обратите внимание, что необходимо только перечислить те библиотеки, которые не являются частью стандартной библиотеки Python. У Вашего пользователя и так будет установлен Python, если он будет использовать вашу библиотеку.
Наша библиотека не требует никаких внешних зависимостей, поэтому Вы можете исключить четыре библиотеки, перечисленных в примере выше.

Соавтор, который разветвляет репозиторий проекта и устанавливает закрепленные библиотеки с помощью pip, будет иметь те же версии, что и Вы. Это значит, что они должны работать.
Измените информацию setuptools так, чтобы она соответствовала информации вашей библиотеки. Существует множество других необязательных аргументов и классификаторов ключевых слов — см. перечень здесь. Более подробные руководства по setup.py можно найти здесь и здесь.

Сохраните свой код в локальном репозитории Git. Пора переходить к созданию библиотеки!

Шаг 10: Соберите первую версию

Twine — это набор утилит для безопасной публикации библиотек Python на PyPI. Добавьте библиотеку Twine в следующую пустую строку файла require_dev.txt таким образом:

twine==1.13.0

Затем закрепите Twine в Вашей виртуальной среде, переустановив библиотеки needs_dev.txt.

pip install -r requirements_dev.txt

Затем выполните следующую команду, чтобы создать файлы библиотеки:

python setup.py sdist bdist_wheel

Необходимо создать несколько скрытых папок: dist, build и — в моем случае — notebookc.egg-info. Давайте посмотрим на файлы в папке dist. Файл .whl — это файл Wheel — встроенный дистрибутив. Файл .tar.gz является исходным архивом.

На компьютере пользователя pip будет по мере возможности устанавливать библиотеки как wheels/колеса. Они устанавливаются быстрее. Когда pip не может этого сделать, он возвращается к исходному архиву.

Давайте подготовимся к загрузке нашего колеса и исходного архива.

Шаг 11: Создайте учётную запись TestPyPI

PyPI — каталог библиотек Python (Python Package Index). Это официальный менеджер библиотек Python. Если файлы не установлены локально, pip получает их оттуда.

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

Шаг 12: Опубликуйте библиотеку в PyPI

Используйте Twine для безопасной публикации вашей библиотеки в TestPyPI. Введите следующую команду — никаких изменений не требуется.

twine upload --repository-url https://test.pypi.org/legacy/ dist/*

Вам будет предложено ввести имя пользователя и пароль. Не забывайте, что TestPyPI и PyPI имеют разные пароли!

При необходимости исправьте все ошибки, создайте новый номер версии в файле setup.py и удалите старые артефакты сборки: папки build, dist и egg. Перестройте задачу с помощью python setup.py sdist bdist_wheel и повторно загрузите с помощью Twine. Наличие номеров версий в TestPyPI, которые ничего не значат, особой роли не играют — Вы единственный, кто будет использовать эти версии библиотек.

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

Шаг 13: Проверьте и используйте установленную библиотеку

Создайте еще одну вкладку в командном интерпретаторе и запустите другую виртуальную среду.

python3.7 -m venv my_env
source my_env/bin/activate

Если Вы уже загрузили свою библиотеку на официальный сайт PyPI, то сможете выполнить команду pip install your-package . Мы можем извлечь библиотеку из TestPyPI и установить его с помощью измененной команды.

Вот официальные инструкции по установке вашей библиотеки из TestPyPI:

Вы можете заставить pip загружать библиотеки из TestPyPI вместо PyPI, указав это в index-url.

pip install --index-url https://test.pypi.org/simple/ my_package

Если хотите, чтобы pip также извлекал и другие библиотеки из PyPI, Вы можете добавить — extra-index-url для указания на PyPI. Это полезно, когда тестируемая библиотека имеет зависимости:

pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple my_package

Если у вашей библиотеки есть зависимости, используйте вторую команду и подставьте имя вашей библиотеки.

Вы должны увидеть последнюю версию библиотеки, установленного в Вашей виртуальной среде.

Чтобы убедиться, что Вы можете использовать свою библиотеку, запустите сеанс IPython в терминале следующим образом:

python

Импортируйте свою функцию и вызовите ее со строковым аргументом. Вот как выглядит мой код:

from notebookc.notebookc import convert
convert(“Jeff”)

После я получаю следующий вывод:

I’ll convert a notebook for you some day, Jeff.

(Когда-нибудь я конвертирую для тебя блокнот, Джефф)

Шаг 14: Залейте код на PyPI

Залейте Ваш код на настоящий сайт PyPI, чтобы люди могли скачать его с помощью pip install my_package .

Загрузить код можно так:

twine upload dist/*

Обратите внимание, что Вам нужно обновить номер версии в setup.py, если Вы хотите залить новую версию в PyPI.

Отлично, теперь давайте загрузим нашу работу на GitHub.

Шаг 15: Залейте библиотеку на GitHub

Убедитесь, что Ваш код сохранен.

Моя папка проекта notebookc выглядит так:

.git .gitignore LICENSE README.md requirements_dev.txt setup.py notebookc/__init__.py notebookc/notebookc.py 

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

Переместите вашу локальную ветку на GitHub с помощью git push origin my_branch .

Шаг 16: Создайте и объедините PR

В браузере перейдите к GitHub. У Вас должна появиться опция сделать pull-запрос. Нажимайте на зеленые кнопки, чтобы создать, объединить PR и чтобы убрать удаленную ветку.
Вернувшись в терминал, удалите локальную ветку с git branch -d my_feature_branch .

Шаг 17: Обновите рабочую версию на GitHub

Создайте новую версию библиотеки на GitHub, кликнув на релизы на главной странице репозитория. Введите необходимую информацию о релизе и сохраните.

На сегодня достаточно!

Мы научимся добавлять другие файлы и папки в будущих статьях.
А пока давайте повторим шаги, которые мы разобрали.

Итог: 17 шагов к рабочей библиотеке

image

  1. Составьте план.
  2. Дайте имя библиотеке.
  3. Настройте среду.
  4. Создайте организацию в GitHub.
  5. Настройте GitHub Repo.
  6. Клонируйте и добавьте директории.
  7. Скачайте и установите requirements_dev.txt.
  8. Поработайте с кодом.
  9. Создайте setup.py.
  10. Соберите первую версию.
  11. Создайте учётную запись TestPyPI.
  12. Опубликуйте библиотеку в PyPI.
  13. Проверьте и используйте установленную библиотеку.
  14. Залейте код на PyPI.
  15. Залейте библиотеку на GitHub.
  16. Создайте и объедините PR.
  17. Обновите рабочую версию на GitHub.

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:

  • Курс по Machine Learning (12 недель)
  • Курс «Профессия Data Scientist» (24 месяца)
  • Курс «Профессия Data Analyst» (18 месяцев)
  • Курс «Python для веб-разработки» (9 месяцев)

Читать еще

  • Крутые Data Scientist не тратят время на статистику
  • Как стать Data Scientist без онлайн-курсов
  • Шпаргалка по сортировке для Data Science
  • Data Science для гуманитариев: что такое «data»
  • Data Scienсe на стероидах: знакомство с Decision Intelligence
  • учебный процесс
  • data science
  • data analysis

Урок #2 — Создание проекта. Основные файлы

В ходе урока мы выполним создание проекта на основе фреймворка Джанго. Мы рассмотрим все файлы и папки, что были созданы вместе с проектом, а также запустим локальный сервер и посмотрим на сайт через браузер.

Видеоурок

Установка Django

Поскольку Django является фреймворком языка Python , то сперва необходимо установить сам язык. Для этого необходимо скачать последнюю версию Питона на их официальном сайте и следовать простым инструкциям. Если вы находитесь на Windows, то обязательно отметьте галочкой поле Add Python X.Y to PATH .

Если у вас возникли проблемы с установкой Python, то вы можете посмотреть специальный урок , в котором будет рассказано как установить Python на компьютер.

Для установки Django используйте следующую команду:

pip install Django

Если вы находитесь на Маке или Linux, то к слову pip пропишите цифру 3: pip3 . Если у вас не установлен pip на компьютере, то скачайте его по этой ссылке .

Создание проекта

Django проект можно создать в любой папке, поэтому создайте какую-либо папку и откройте её в окне команд. На Windows это можно сделать нажатием правой клавиши мыши на папку при зажатой клавише Shift:

В командной строке пропишите команду:

django-admin startproject НАЗВАНИЕ_ПРОЕКТА

Вместо «название проекта» впишите любое название для вашего проекта.

Запуск локального сервера

Для запуска сервера необходимо перейти в командную строку и открыть в ней папку с вашим проектом. На Windows это можно сделать нажатием правой клавиши мыши на папку при зажатой клавише Shift :

Далее перейдите в папку вашего проекта (в нашем случае это папка «mysite»):

cd mysite

Пропишите команду для запуска локального сервера:

python manage.py runserver

Условия написания команды:

  • Пропишите слово python3 в случае если вы на маке или Linux;
  • Если вы на Windows и у вас всего одна версия Питона, то пишите слово python;
  • Если вы на Windows и у вас несколько версий Python, то либо удалите все версии, кроме последней, либо укажите путь к последней версии Питона.
Несколько полезных советов
  1. В данном курсе используется версия Django 3 , поэтому чтобы не возникали дополнительные непонятные моменты, то лучше установите такую же версию Django;
  2. Стандартная командная строка в Windows не особо удобная, поэтому вместо неё лучше использовать сторонние программы. Очень удобной и легкой в работе является программа PowerShell, которую вы можете скачать здесь ;
  3. Путь к интерпретатору можно не прописывать вручную, если поставить virtualenv и в нём указать нужную версию Python и Django. Если работать в PyCharm, то в преднастройках можно выставить нужный интерпретатор.

Как правильно создать проект на python

В прошлой теме было описано создание простейшего скрипта на языке Python. Для создания скрипта использовался текстовый редактор. В моем случае это был Notepad++. Но есть и другой способ создания программ, который представляет использование различных интегрированных сред разработки или IDE.

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

Для Python можно использовать различные среды разработки, но одной из самых популярных из них является среда PyCharm , созданная компанией JetBrains. Эта среда динамично развивается, постоянно обновляется и доступна для наиболее распространенных операционных систем — Windows, MacOS, Linux.

Правда, она имеет одно важное ограничение. А именно она доступна в двух основных вариантах: платный выпуск Professional и бесплатный Community. Многие базовые возможности доступны и в бесплатном выпуске Community. В то же время ряд возможностей, например, веб-разработка, доступны только в платном Professional.

В нашем случае воспользуемся бесплатным выпуском Community. Для этого перейдем на страницу загрузки и загрузим установочный файл PyCharm Community.

IDE PyCharm

После загрузки выполним его установку.

Установка PyCharm

После завершения установки запустим программу. При первом запуске открывается начальное окно:

Первая программа в PyCharm

Создадим проект и для этого выберем пункт New Project .

Далее нам откроется окно для настройки проекта. В поле Location необходимо указать путь к проекту. В моем случае проект будет помещаться в папку HelloApp. Собственно название папки и будет названием проекта.

Настройка проекта в PyCharm

Кроме пути к проекту все остальные настройки оставим по умолчанию и нажмем на кнопку Create для создания проекта.

После этого будет создан пустой проект:

Первый проект в PyCharm

В центре среды будет открыт файл main.py с некоторым содержимым по умолчанию.

Теперь создадим простейшую программу. Для этого изменим код файла main.py следующим образом:

name = input("Введите ваше имя: ") print("Привет,", name)

Для запуска скрипта нажмем на зеленую стрелку в панели инструментов программы:

Запуск программы в PyCharm

Также для запуска можно перейти в меню Run и там нажать на подпункт Run ‘main’ )

После этого внизу IDE отобразится окно вывода, где надо будет ввести имя и где после этого будет выведено приветствие:

Начиная Python-проект: The Right Way

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

Установка

До того как написать хоть строчку кода, первое что я делаю — создаю виртуальное окружение. Что такое виртуальное окружение? Это установка python отдельно от остальной части системы (и дефолтного pythona’а). Какая от этого польза? Представьте себе, что у вас есть два проекта, над которыми вы работаете. Если оба испольузют какую-либо библиотеку (например, requests), и в одном из проектов используется старая версия (которую нельзя корректно обновить, т.к. другие библиотеки используют старую версию requests), как вы сможете использовать новую версию requests в другом проекте? С помощью виртуального окружения.

Для начала установите virtualenvwrapper (обертка над фантастическим пакетом virtualenv). Добавьте в ваш .bashrc строчку /usr/local/bin/virtualenvwrapper.sh и перезагрузите свой профиль с помощью source:

source ~/.bashrc 

Теперь у вас должна появиться команда mkvirtualenv, доступная через автодополнение с помощью tab. Если вы используете Python старше версии 3.3, виртуальное окружение поддерживает этот язык и установка этого пакета не требуется. mkvirtualenv создаст новое виртуальное окружение под названием my_project с уже установленными pip и setuptools. Для Python 3 требуемые команды выглядят так:

python -m venv source /bin/activate 

Теперь когда виртуальное окружение создано, пришло время инициализировать средство управления исходниками. Предполагая что это git (ну, потому что он…), введем

git init . 

Так же полезно добавить в .gitignore все скомпилированые Python-ом файлы и каталоги __pychache__ . Для этого создайте файл .gitignore и поместите в него следующее:

*.pyc __pycache__ 

Теперь подходящее время добавить в проект README файл. Даже если вы единственный, кто будет видеть код, это хорошее упражнение для организации ваших мыслей. README файл должен описывать что делает проект, его зависимости и как его использовать. Я пишу README файлы с использованием разметки Markdown, во-первых потому что GitHub автоматически оформляет любой файл названный README.md, а во-вторых потому что я пишу все (!) документы в разметке Markdown.

И наконец, сделайте первый коммит содержащий два файла (.gitignore, README.md), которые вы только что создали. Для этого введите:

git add .gitignore README.md git commit -m "initial commit" 

Каркасы!

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

В качестве примера приложения я использую скрипт, недавно написанный обучаемым во время одного из наших занятий. Цель скрипта — создать csv-файл, содержащий самые кассовые фильмы прошлого года (по версии IMDB) и ключевые слова связанные с этими фильмами на IMDB. Это был довольно простой проект, для того что бы завершить его за одно занятие, но достаточный по сложности, что бы требовать размышлений.

Сперва создайте основной файл, который будет точкой входа в приложение. Я назвал его imdb.py. Потом скопируйте следующий код в редактор:

1 2 3 4 5 6 7 8 9 
""Script to gather IMDB keywords from 2013's top grossing movies.""" import sys  def main():  """Main entry point for the script."""  pass  if __name__ == '__main__':  sys.exit(main()) 

Звучит неправдоподобно, но это вполне функциональная программа. Вы можете запустить ее и получить правильный код выхода (т.е. 0, хотя справедливо отметить, что пустой файл будет так же возвращать правильный код). Затем я делаю заглушки для функций и/или классов, которые по моему мнению будут нужны:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
"""Script to gather IMDB keywords from 2013's top grossing movies.""" import sys  URL = "http://www.imdb.com/search/title?at=0&sort=boxoffice_gross_us,desc&start=1&year=2013,2013"  def main():  """Main entry point for the script."""  pass  def get_top_grossing_movie_links(url):  """Return a list of tuples containing the top grossing movies of 2013 and link to their IMDB  page."""  pass  def get_keywords_for_movie(url):  """Return a list of keywords associated with *movie*."""  pass  if __name__ == '__main__':  sys.exit(main()) 

Выглядит сносно. Отмечу, что обе функции включают параметры (например, get_keywords_for_movie принимает параметр url). Это может показаться странным для заглушек. Зачем здесь параметры? Аргументация такая же, как и для предварительного документирования заглушек: если я не знаю какие агрументы должна принимать функция, значит я недостаточно об этом думал.

В этом месте я верятно закомичусь, т.к. проделал определенную часть работы, которую не хотел бы потерять. После этого перейдем к реализации. Я всегда начинаю с реализации функции main, т.к. “центр” использующий все остальные функции. Вот реализация функции main в imdb.py:

1 2 3 4 5 6 7 8 9 10 11 
import csv  def main():  """Main entry point for the script."""  movies = get_top_grossing_movie_links(URL)  with open('output.csv', 'w') as output:  csvwriter = csv.writer(output)  for title, url in movies:  keywords = get_keywords_for_movie(  'http://www.imdb.com<>keywords/'.format(url))  csvwriter.writerow([title, keywords]) 

Несмотря на то что get_top_grossing_movie_links и get_keywords_for_movie не реализованы, я знаю достаточно о том, как их использовать. Функция main делает именно то, что мы обсуждали вначале: получает самые кассовые фильмы года и пишет их в csv-файл вместе с их ключевыми словами.

Теперь все что осталось, это реализовать недостающие функции. Любопытно, что даже если мы знаем, что get_keywords_for_movie будет вызван после get_top_grossing_movie_links, мы можем реализовать их в том порядке, который больше нравится. Это не тот случай, когда пишешь скрипт с нуля и добавляешь функционал в том порядке, в которм идет разработка. Вы были бы вынуждены полностью написать первую функцию, прежде чем перети ко второй. Тот факт, что мы можем реализовать (и проверить!) функции в любом порядкепоказывает, что они слабо связаны.

Давайте первым реализуем функцию get_keywords_for_movie:

1 2 3 4 5 6 7 8 
def get_keywords_for_movie(url):  """Return a list of keywords associated with *movie*."""  keywords = []  response = requests.get(url)  soup = BeautifulSoup(response.text)  tables = soup.find_all('table', class_='dataTable')  table = tables[0]  return [td.text for tr in table.find_all('tr') for td in tr.find_all('td')] 

Мы используем библиотеки requests и BeautifulSoup, поэтому нам нужно установить их через pip. Теперь можно внести в список зависимостей проекта новые библиотеки: pip freeze requirements.txt и закомитить изменения. Таким образом мы всегда сможем создать виртуальное окружение и установить именно те библиотеки (и версии) которые нужны для запуска приложения.

Наконец напишем реализацию для функции get_top_grossing_movie_links:

1 2 3 4 5 6 7 8 9 
def get_top_grossing_movie_links(url):  """Return a list of tuples containing the top grossing movies of 2013 and link to their IMDB  page."""  response = requests.get(url)  movies_list = []  for each_url in BeautifulSoup(response.text).select('.title a[href*="title"]'):  movie_title = each_url.text  movies_list.append((movie_title, each_url['href']))  return movies_list 

Вот финальное содержание imdb.py:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 
""Script to gather IMDB keywords from 2013's top grossing movies.""" import sys import requests from bs4 import BeautifulSoup import csv  URL = "http://www.imdb.com/search/title?at=0&sort=boxoffice_gross_us,desc&start=1&year=2013,2013"  def get_top_grossing_movie_links(url):  """Return a list of tuples containing the top grossing movies of 2013 and link to their IMDB  page."""  response = requests.get(url)  movies_list = []  for each_url in BeautifulSoup(response.text).select('.title a[href*="title"]'):  movie_title = each_url.text  movies_list.append((movie_title, each_url['href']))  return movies_list  def get_keywords_for_movie(url):  """Return a list of keywords associated with *movie*."""  keywords = []  response = requests.get(url)  soup = BeautifulSoup(response.text)  tables = soup.find_all('table', class_='dataTable')  table = tables[0]  return [td.text for tr in table.find_all('tr') for td in tr.find_all('td')]  def main():  """Main entry point for the script."""  movies = get_top_grossing_movie_links(URL)  with open('output.csv', 'w') as output:  csvwriter = csv.writer(output)  for title, url in movies:  keywords = get_keywords_for_movie('http://www.imdb.com<>keywords/'.format(url))  csvwriter.writerow([title, keywords])  if __name__ == '__main__':  sys.exit(main()) 

Приложение, которое начиналось с пустого окна редактора готово. После запуска скрипт сгенерирует output.csv, содержащий именно то, что нужно. Для скрипта такого размера я не стал бы писать тесты, т.к. результат работы программы и есть тест. Тем не менее, написание тестов в данном случае возможно (так как наши функции слабо связаны), что бы проверить каждую функцию отдельно (изолированно).

Заключение

Надеюсь теперь у вас есть план действий для начала работы над python-проектом с нуля. Не смотря на то, что у каждого есть свой метод начала работы над проектом, скорее всего мой метод подойдет и вам. Как всегда, если у вас есть какие-либо вопросы, не стесняйтесь задавать их в комментариях или напишите мне на jeff@jeffknupp.com.

Posted by Toly Feb 9 th , 2014 python, translation

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *