Друзья, добрый вечер! У нас отличные новости, открыт набор в новую группу по курсу «Разработчик Python». Группа стартует уже в начале июля, а прямо сейчас, по устоявшейся традиции, мы делимся полезным переводом подготовленным для студентов данного курса.



Когда вы только начинаете учить Python, кто-то объясняет вам, что вы можете добавить свою папку с исходниками в переменную среды PYTHONPATH и тогда ваш код можно будет импортировать из других директорий. Очень часто объясняющий забывает сказать, что в большинстве случаев – это плохая идея. Некоторые люди узнают это в интернете, другие просто понимают на собственном опыте. Но слишком большое количество людей (особенно неопытные программисты), думают, что других альтернатив быть не может.

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

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

Базовые инструменты


Setuptools


Setuptools – стандартный способ создавать пакеты в Python. Он работает где угодно и хорошо справляется со своей задачей.

Для чего: создание egg, zip или wheel файлов из исходников, определение метаданных для вашего проекта, совместная структурированная и стандартизированная работа над кодом.
Когда используется: Всегда, когда вы пишете код, который должен запускаться на чьей-либо другой машине.
Альтернативы: Poetry, Flit

virtualenv


Virtualenv – менеджер виртуальной среды. Такие изолированные среды представляют собой автономно установленный python с определенным набором предустановленных пакетов. Использование virtualenv означает, что вам не нужно устанавливать пакеты в python системы по умолчанию.

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

Pip


Pip – наиболее распространённый менеджер пакетов в python. Он позволяет устанавливать локальные или удаленные пакеты в вашу виртуальную среду или Python системы.

Для чего: установка и удаление пакетов, отслеживание версий пакетов, которые вы используете.
Когда используется: Всегда.
Альтернативы: Poetry, Conda

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


Для более тщательного ознакомления у python.org есть отдельная страница: packaging.python.org

distutils


distutils – это предшественник setuptools. Последний активно использует функционал distutils, поэтому нередко приходится взаимодействовать именно с этим инструментом. Distutils – это не совсем тот инструмент, который вы должны иметь в своем арсенале, но вы должны знать, каким образом он вписывается в общую картину.

Pypi


Pypi или Python Package Index — это большой репозиторий, в котором собраны все ваши самые любимые модули Python. Например, тот же самый pip берет билды пакетов именно оттуда.

Для чего: Для публикации вашего кода.
Когда используется: Когда существует пакет, который вы хотите показать сообществу.

Pypiserver


Pypiserver – это одна из реализаций Package Index API, используемая Pypi. Вы можете создать собственный репозиторий, например, для всей вашей компании и публиковать пакеты не делая публичных релизов.

Для чего: Создание собственных репозиториев внутри организации.
Когда используется: Когда вашему коду не нужна публичная огласка, но над ним нужен полный контроль.
Альтернативы: Warehouse (используется Pypi), djangopypi

Poetry


Poetry является альтернативной системой работы с пакетами, которая заменяет setuptools, pip и некоторые другие инструменты, построенные на их основе. Это попытка полностью пересмотреть то, как работает система пакетов в Python. На настоящее время poetry имеет множество положительных отзывов, но не является самым распространённым инструментом.

Для чего: обработка и распространение пакетов, управление зависимостями, предотвращение проблем с разрешением зависимостей.
Когда используется: Когда у вас намечается новый проект и вы не боитесь использовать узкоспециализированные инструменты.
Альтернативы: Pipenv

Pipenv


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

Для чего: обработка и распространение пакетов, управление зависимостями.
Когда используется: вам нужен инструмент вроде Poetry, который вызовет меньше вопросов.
Альтернативы: Poetry.

Документация


Sphinx


Sphinx – инструмент для создания документации. Изначально он был создан для обработки документации Python, но стал инструментом общего пользования. Он является наиболее распространенным вариантом для проектов на Python.

Для чего: создание PDF-или HTML-документов с помощью языка разметки из reStructuredText источников.
Когда используется: Когда вашему проекту, API или коду требуется внешняя документация.
Альтернативы: Docutils, Doxygen

autodoc


autodoc — это фундаментальное расширение для Sphinx, которое позволяет создавать reStructuredText файлы из исходного кода на Python с подписями для каждого класса, функции, модуля и так далее.

Для чего: документирование вашего кода или API.
Когда используется: Фактически, каждый раз, когда вы используете Sphinx.
Альтернативы: autosummary

Тестирование


py.test


py.test – по моему мнению, является лучшим пакетом для тестирования на Python. У него множество функций, хотя не все из них раскрыты должным образом, поэтому некоторое время займет поиск всех возможностей, которые предоставляет py.test.

Для чего: тестирование вашего кода.
Когда используется: Всегда, когда вам лень тестировать вручную.
Альтернативы: unittest, nose

Hypothesis


Hypothesis – это инструмент для тестирования отдельных свойств. Короче говоря, он генерирует случайные сценарии тестирования в соответствии с вашими спецификациями, пока не найдет сценарий, при котором тест не проходит успешно. Потратьте некоторое время на изучение принципов, прежде чем начинать использовать этот инструмент.

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

tox


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

Для чего: для кода, который должен запускаться в различных условиях и средах. Также полезен для CI.
Когда используется: Когда нужно, чтобы ваш код поддерживался различными версиями Python, запускался в различных средах и на разных операционных системах.
Альтернативы: bash scrips, CI pipelines

Другие инструменты


pyenv


pyenv – менеджер версий python. Он направлен на упрощение локального рабочего процесса разработчиков при работе с несколькими версиями.

Для чего: запуск различных проектов разными версиями Python.
Когда используется: Вам нужно работать с глобальными версиями Python и у вас их много.
Альтернативы: manual management, virtualenv, Poetry, Pipenv

PyScaffold


PyScaffold — это инструмент для инициализации структуры проекта стандартизированным способом и предоставления некоторых из перечисленных выше инструментов без необходимости настраивать их вручную. Очень гибкий.

Для чего: для загрузки проектов, работы с несколькими проектами с одинаковым инструментарием и структурой.
Когда используется: всегда (если вы знакомы с этим инструментом, но не пытайтесь впервые его использовать, когда вы спешите)
Альтернативы: python-project-template, Cookiecutter

flake8


flake8 – один из самых популярных линтеров для Python. Он запускает различные сценарии для проверки соответствия вашего кода требованиям руководства по стилю Python (PEP-8).

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

Black


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

Для чего: автоматическое форматирование кода.
Когда используется: Когда у вас нет проблем с тем, чтобы отказаться от ручного управления вашим кодом.
Альтернативы: autopep8, yapf

На этом все. Ждем ваши комментарии ;-).

Комментарии (36)


  1. Anshi85
    18.06.2019 18:50

    Добрый вечер. Наслышан о ваших курсах. Грешен признаюсь для ознакомления скачал ваш курс по питону с одного ресурса, теперь хочу уточнить, у вас занятия действительно в виде вебинара по 2 — 2.5 часа? Не кажется ли вам, что это тяжеловато усваивать? В каком формате у вас проходят занятия?


    1. MaxRokatansky Автор
      19.06.2019 01:54

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


      1. Anderson
        19.06.2019 09:53

        Живые вебинары — это замечательно. Но запись будет, если пропустил?


        1. MaxRokatansky Автор
          19.06.2019 10:45

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


  1. Stas911
    18.06.2019 20:44
    +1

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


    1. Gonzito
      19.06.2019 10:49

      Полностью с Вами согласен. Пожалуй, гляну на PyScaffold.


  1. Takumi
    19.06.2019 06:00

    Docker альтернатива virtualenv? Вы серьезно?


    1. Singaporian
      19.06.2019 10:58

      А что не так? Если вы пакуете в Docker, зачем вам теперь virtualenv? (подразумевая, что в мире микросервисов каждый проект в отдельном контейнере и нет надобности разделять по разным энвам, а значит можно всегда использовать базовый).


      1. Takumi
        19.06.2019 11:25

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


        1. dark_ruby
          19.06.2019 12:47

          это не делает его "не альтернативой" virtualeнв'у


        1. Singaporian
          19.06.2019 12:51

          (это не я вас минусую)
          Вы не ответили на вопрос «Если вы пакуете в Docker, зачем вам теперь virtualenv?». Потому что ответ на этот вопрос есть ответ, является ли Docker альтернативой.

          Если Docker может больше, то это не отменяет того факта, что он может не меньше, а значит является альтернативой. Даже если его основное предназначение лежит в другой сфере вообще.


    1. trapwalker
      20.06.2019 10:48

      А почему нет? При использовании докера можно не использовать virtualenv. Просто нет никакого смысла.

      [Да уж… надо обновлять комментарии, иначе можно оказаться очень «оригинальным»]


      1. gecube
        20.06.2019 11:09

        Не всегда и не везде. А еще это может быть попросту неудобно.
        Но, в целом, — да, docker обычно позволяет больше не возиться с venv.


  1. Yuriy_krd
    19.06.2019 07:49

    Прошел по вашей ссылке. Для регистрации необходимо заполнить два поля. Что в них вводить изначально — непонятно, никаких намеков нет. И только когда начинаешь заполнять чем-нибудь, тогда выскакивает сверху подсказка (кстати, очень маленький шрифт и очень сильно сливается с фоном поля). Поправьте, пожалуйста.


    1. Arty_Fact
      19.06.2019 10:42

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


    1. MaxRokatansky Автор
      19.06.2019 10:49

      Подскажите пожалуйста, в каком браузере возникла проблема?


      1. Yuriy_krd
        19.06.2019 10:56

        браузер Firefox 67.0.2х64 + Win 7Profх64. Вот как это окно смотрится у меня:


        1. Alexus819
          19.06.2019 11:38

          может монитор поменять? )


          1. Yuriy_krd
            19.06.2019 11:50

            я бы Вас плюсанул, была бы возможность ) Но, увы) А если начать вводить текст, то эти поля смотрятся тоже интересно. Предлагаете поменять на монитор 50+ ?)


            1. MaxRokatansky Автор
              19.06.2019 11:52
              +2

              Если честно, не совсем понимаю в чем проблема. Все видно же


              1. Yuriy_krd
                19.06.2019 11:57

                Видно, если начать что-либо писать. Если изначально открывается страничка, то там пусто. Нет никаких подсказок. Только методом "попробовать ввести что-нибудь" становится понятно, что вводить. Я считаю такое поведение формы неправильным и недружелюбным.
                P.S. Но могу быть неправ, ибо обладаю некоторой долей перфекционизма.


                1. Arty_Fact
                  19.06.2019 12:37
                  +3

                  Нет, серьезно, меняйте монитор. На вашем скриншоте видны подсказки.
                  Думаю, дело в контрастности и(или) яркости.


                  1. Yuriy_krd
                    19.06.2019 12:40
                    +1

                    Скорее всего, Вы правы. Но, увы, это рабочий. Из-за данной формы мне его не поменяют. :) Вот когда что-то по работе не будет видно, тогда да. Тогда переименую свои претензии: "На недорогих TN-мониторах подсказки в полях формы сливаются с фоном".


                    1. Arty_Fact
                      19.06.2019 12:44

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


                      1. iig
                        19.06.2019 21:46

                        Каждый раз, когда вижу странный подбор цветов (тёмно-серый по светло-серому например), я испытываю удивление.


          1. rawzes
            19.06.2019 14:17
            -1

            Может, всё-таки, поменять дизайнера?
            Когда продуктом невозможно пользоваться из-за некритичных неисправностей на клиентской стороне — так себе продукт.


            1. MaxRokatansky Автор
              19.06.2019 14:18

              Вы о чем?


              1. Yuriy_krd
                19.06.2019 14:25

                Я думаю, что rawzes обо мне :) В чем-то я с ним согласен. Да, у меня, судя по всему, весьма посредственный монитор, из-за которого у меня не видно то, что видно у остальных. Но (исключительно) по моему мнению, стоило бы спроектировать данный интерфейс так, чтобы не страдали даже такие пользователи, как я :)


                1. MaxRokatansky Автор
                  19.06.2019 14:38

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


                  1. rawzes
                    19.06.2019 15:12

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

                    «Если ваша анатомия настолько искажает UX нашего кресла, возможно стоит остро поднять вопрос о пластической операции»


                  1. T13Nemo
                    19.06.2019 21:55

                    Поддержу всех вышеотписавшихся.


                    Контрастность не вполне удачно подобрана.
                    И это не проблема монитора (сколько бы плохим он не был), а дизайна.
                    А еще, не стоит забывать про физические особенности зрения некоторых людей, для них контрастность критически важна. В противном случае они попросту ничего не увидят. Глаза менять пока еще толком не научились.


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


                  1. jahr
                    20.06.2019 09:53

                    Дело может быть не только в мониторе, тут еще может быть и плохое зрение, которое не поменяешь. Обычно я не поднимаю тему неконтрастного дизайна, потому что понимаю, что буду в меньшинстве, но раз уж тут зашел разговор: Вы просто не представляете, какую бурю отрицательных эмоций иногда испытываешь, когда на пустом месте, безо всякой необходимости, просто потому что дизайнер «так видит», не можешь прочитать простой текст, причем в браузере это еще полбеды, там почти всегда что-то можно с этим сделать, но иногда это происходит в интерфейсе какой-то другой программы, и там ситуация может быть намного сложнее. Максимально бесят надписи серым по серому.)


            1. Arty_Fact
              19.06.2019 14:45

              Я вам для наглядности

              картинку сделал


  1. gecube
    19.06.2019 17:50

    Нам black не зашел. Он реально портит код. А вот yapf — вполне. Как и pre-commit для установки гит хуков


    1. Stas911
      20.06.2019 00:50

      У меня к нему только претензии по длине строки — то он разбивает то, что не нужно, то наоборот. Никак что-то не поборю


      1. gecube
        20.06.2019 01:34

        к black или yapf?


        У нас были странности с тем, как он разбивает код вида


            (
                ffmpeg.input(url, rtsp_transport='tcp',
                             stimeout=1000).output(str(save_path), **{
                                 'qmin': 2,
                                 'qmax': 2,
                                 'vframes': 1
                             }).global_args('-loglevel', 'debug').overwrite_output().run()
            )
        

        Собственно круглые скобки вокруг и есть тот лайф-хак, чтобы форматирование не сбивалось.