Вступление

Кодирование на Python - это круто, и с каждым новым выпуском оно становится все круче! Для меня это в основном связано с огромным количеством свободно доступных библиотек, их удобочитаемостью и недавно введенными аннотациями типов. Однако, особенно мы, специалисты по данным, часто создаем большие и беспорядочные записные книжки Jupyter или файлы Python, за которыми трудно следить. Кроме того, мы часто сталкиваемся с конфликтами версий, когда один проект зависит от другой версии той же библиотеки. Исправление этого требует слишком много времени и часто приводит к проблемам с другими проектами. Должен быть способ избежать этого и облегчить нашу жизнь. В этой статье я рассмотрю инструменты, которые использую, и методы, которым обычно следую. Надеюсь, это поможет мне в будущем вспомнить все это и, что более важно, поможет вам также узнать что-то полезное. Без лишних слов, давайте запачкаем руки.

Среда Python

Переводчик

Начнем с самого главного при работе с python: интерпретатора. Конечно, вы можете просто загрузить и установить свою любимую версию python и поместить в нее все. Но что, если у вас есть программы, требующие разных версий Python, или программы, которые зависят от разных версий одного и того же стороннего модуля, и вы хотите легко переключаться между этими программами?

Pyenv вам в этом поможет!

Pyenv - это набор из трех инструментов, два из которых я представляю здесь: pyenv (используется для установки python) и pyenv-virtualenv (используется для настройки ваших глобальных инструментов). . Вы можете установить их

curl https://pyenv.run | bash

После этого добавьте следующие строки в свой .bashrc (то же самое для .zshrc), чтобы pyenv был доступен в вашем терминале.

export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

и, наконец, перезапустите терминал. Теперь вы можете использовать pyenv для установки практически любого интерпретатора Python, включая pypy и anaconda. Обратите внимание, что pyenv собирает python локально на вашем компьютере. Для сборки python требуется несколько библиотек. На моем компьютере с Ubuntu я должен установить следующие, чтобы не столкнуться с проблемами

sudo apt-get install build-essential libsqlite3-dev sqlite3 bzip2 libbz2-dev zlib1g-dev libssl-dev openssl libgdbm-dev libgdbm-compat-dev liblzma-dev libreadline-dev libncursesw5-dev libffi-dev uuid-dev

Теперь, чтобы установить интерпретатор Python, просто выполните

pyenv install VERSION_YOU_WOULD_LIKE_TO_INSTALL

Вы можете перечислить все версии, доступные через pyenv

pyenv install --list

Чтобы сделать его конкретным, давайте установим python 3.7.5 и сделаем его глобальным интерпретатором по умолчанию.

pyenv install 3.7.5
pyenv global 3.7.5

Когда вы набираете python - version, вы должны вернуть Python 3.7.5

Управление зависимостями

Управление зависимостями проекта в python может стать беспорядочным или ручным. Существует множество инструментов, которые помогут вам в этом.

Больше всего я использую стихи.

Помимо всего прочего, поэзия помогает легко

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

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

curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python

Другой способ, который я собираюсь показать вам, - использовать pip и pyenv-virtualenv. Вы можете спросить: а почему бы просто не пип? Потому что это установит поэзию и ее зависимости в вашу глобальную среду, в которой вы, вероятно, не нуждаетесь и не хотите. Итак, вот необходимые команды

# Create a virtual environment called tools that is based on 3.7.5
pyenv virtualenv 3.7.5 tools 
# Install poetry into the tools virtual env
pyenv activate tools
pip install poetry 
# Check installed poetry version
poetry --version
# Leave the virtual env 
pyenv deactivate 
# This does not work yet 
poetry --version
# Add your tools virtual env to the globally available ones
pyenv global 3.7.5 tools
# Now this works and you can start using poetry
poetry --version

Прежде чем мы начнем использовать поэзию для создания нашего первого проекта, я рекомендую настроить его так, чтобы он создавал виртуальную среду вашего проекта в папке .venv внутри каталога проекта. Это очень удобно, когда вы используете IDE, такие как VS Code или PyCharm, поскольку они сразу распознают это и выбирают правильный интерпретатор.

# That seems to be peotry prior to 1.0.0
poetry config settings.virtualenvs.in-project true
# That is poetry since 1.0.0
poetry config virtualenvs.in-project true

Обратите внимание, что вам нужно установить эту конфигурацию только один раз, поскольку она установлена ​​глобально и сохраняется.

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

# Initialze a new project
poetry new dsexample 
cd dsexample
# Add modules and create virtual environment.
poetry add pandas=0.25 fastapi --extras all
# As an example of how you could add a git module
poetry add tf2-utils --git [email protected]:Shawe82/tf2-utils.git

Если вы хотите увидеть настоящий проект, использующий все, что я вам здесь представляю, перейдите в мой Github Repo.

Согласованное форматирование и удобочитаемость

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

Черный спешит на помощь!

Black - это инструмент для Python, который позволяет вам сосредоточиться на том, что необходимо, на контенте. Он делает это, освобождая вас от ручного форматирования кода за счет автоматизации. Так как он такой красивый, давайте добавим его в наш проект dsexample и отформатируем все файлы.

# We add black as a development dependency with --dev as we don't
# need it when it comes to production
poetry add --dev black=19.3b0
# Assume we are inside the current toplevel dsexample folder
poetry run black .

Хорошо, теперь все файлы выглядят очень хорошо.

Тип-правильность

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

и вот идет mypy!

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

# We add mypy as a development dependency with --dev as we don't
# need it when it comes to production
poetry add --dev mypy
# Assume we are inside the current toplevel dsexample folder
poetry run mypy .

Запуск mypy может вызвать множество ошибок. Конечно, вы можете настроить его так, чтобы он предупреждал вас только о том, что вас интересует. Вы делаете это, добавляя файл mypy.ini в свой проект и направляя вас и меня в документацию для получения более подробной информации.

Автоматизировать автоматизацию

С помощью black и mypy мы можем избежать форматирования кода вручную или столкнуться с ошибками, которых можно избежать. Но нам все равно придется запускать эти инструменты вручную. Разве это тоже не следует автоматизировать? Да!

Предварительная фиксация - это все, что вам нужно.

Предварительная фиксация - это инструмент, который выполняет проверки перед фиксацией кода в вашем репозитории (я считал само собой разумеющимся, что ваш код находится под контролем версий git). Когда эти проверки не пройдут, ваша фиксация будет отклонена. При этом ваш репозиторий никогда не увидит отформатированный в торговом центре код, код без проверки типа или что-то еще, в зависимости от проверок, которые вы собираетесь включить. Итак, давайте установим предварительную фиксацию.

Вы можете либо установить его прямо в свой проект, используя поэзию, либо установить его на свой локальный компьютер. Я предпочитаю последнее, так как предварительная фиксация используется только локально, а не на сервере CI / CD. Напротив, black и mypy должны работать на сервере CI / CD, поэтому имеет смысл добавить их в зависимости разработчика проекта. Вот как я предлагаю установить его, используя уже существующую виртуальную среду инструмента.

# Install pre-commit into the tools virtual env
pyenv activate tools
pip install pre-commit 
# Leave the virtual env 
pyenv deactivate
# As we have already added the tool venv, it will work directly
pre-commit --version

Чтобы использовать его, вам сначала нужно добавить файл конфигурации с именем .pre-commit-config.yaml в папку верхнего уровня вашего проекта. В этом файле вы настраиваете все обработчики, которые должны запускаться. С mypy и черным этот файл выглядит как

repos:
-   repo: https://github.com/ambv/black
    rev: 19.3b0
    hooks:
    - id: black
      language_version: python3.7
-   repo: https://github.com/pre-commit/mirrors-mypy
    rev: v0.740
    hooks:
    - id: mypy

Наконец, вы должны указать перед фиксацией настроить перехватчики, выполнив

# I assume your are in the top level folder
pre-commit install

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

pre-commit run --all-files

Вот и все, автоматизацию автоматизировали!

Заворачивать

Есть много инструментов, которые помогут вам сосредоточиться на том, что важно. Здесь я представил вам только пару и наверняка есть другие и многие другие. Надеюсь, вы узнали что-то новое и можете сосредоточиться на содержании. Благодарим вас за то, что следили за мной, и не стесняйтесь обращаться ко мне с вопросами, комментариями или предложениями.