Cортировка import с isort для Python в Visual Studio Code
В этом кратком руководстве мы рассмотрим, как настроить Visual Studio Code для автоматической организации импорта Python с помощью isort при сохранении файлов исходного кода.
Введение
Вы можете настроить Visual Studio Code для автоматической сортировки и организации импорта Python модулей при сохранении файлов.
Установка isort
Первым делом нам необходимо установить библиотеку isort
pip install isort
Использование isort
Откройте настройки с помощью ⇧ ⌘ P или Ctrl + Shift + P, затем выполните поиск настроек: Настроить параметры языка…. Нажмите клавишу Enter, а затем выполните поиск Python. В settings.json файле, который будет открыт, добавьте следующие настройки:
"[python]": < "editor.codeActionsOnSave": < "source.organizeImports": true >>
Заключение
Теперь после сохранения файлов с расширением .py, Visual Studio Code будет автоматически сортировать библиотеки.
Простые шаги сделать ваш Python код лучше
У многих из вас есть GIT- репозитории с кодом, в этой заметке я расскажу как сделать ваш Python код лучше.
Форкнем его и попробуем сделать код лучше.
Улучшим читаемость кода
Улучшить читаемость вашего кода очень просто. Мы будем использовать библиотеки для синтаксического форматирования и проверки.
Для начала создадим в репозитории файлы конфигураций для flake8, mypy и black
Установим их для начала:
pip install black flake8 mypy
Разберем flake8. Flake8 — инструмент, позволяющий просканировать код проекта и обнаружить в нем стилистические ошибки и нарушения различных конвенций кода на Python.
Файл setup.cfg для flake8 и mypy
[flake8] max-line-length = 120 exclude =.git,__pycache__,docs/source/conf.py,build,dist,tests ignore = I101,D100,D101,D102,D103,D104,D105,D107,D401,E203,I900,N802,N806,N812,W503,S311,S605,S607,ISC003,ISC001,T101,T000,F541,PL123 per-file-ignores = __init__.py:F401,F403 [mypy] ignore_missing_imports = True disallow_untyped_defs = True check_untyped_defs = True warn_redundant_casts = True no_implicit_optional = True strict_optional = True [mypy-tests.*] ignore_errors = True
- max-line-length — максимальная длина строки
- exclude — список папок, которые исключаются из сканирования flake8
- ignore — список ошибок/ предупреждений, которые так же исключаются. Например: I101: The names in your from import are in the wrong order и D100 — Missing docstring
- per-file-ignores — исключить из сканирования определенный файл
flake8 запустить очень просто:
flake8
Помните, что flake8 не модифицирует код, а просто проверят его. Подправить ошибки придется в ручную.
Теперь поговорим про mypy. У Python нет обязательной статической типизации, но рекомендуется добавлять типы в аргументы функции и возвращаемые типы. Для этого просто запустим mypy и не забудьте подправить ошибки:
mypy .
Создадим файл pyproject.toml для black. black поможет форматировать ваш код в соответствии со стандартом.
Файл pyproject.toml
[tool.black] line-length = 119 target-version = ['py36'] include = '\.pyi?$' exclude = ''' /( \.eggs | \.git | \.hg | \.mypy_cache | \.tox | \.venv | _build | buck-out | build | dist )/ '''
- line-length — длина строки
- target-version — версии Python. py36 — Python 3.6, можно и для других версий.
- include — список того, что включаем в форматирование
- exclude — список того, что исключаем из форматирования
Запуск тоже очень простой:
black .
Рекомендую сохранить отредактированный файл. Так же я уже исправил все ошибки mypy. Взглянем, что же поменялось.
Так выглядел код до правки:
А так после правки:
Код стал читабельнее и теперь у нас статическая типизация. Особое внимание обратите на тип Union. Использовать его необходимо когда допускается использование не любых типов, а только некоторых. Перечислить их нужно в квадратных скобках.
isort
isort — это библиотека Python для сортировки импорта по алфавиту с автоматическим разделением на разделы и по типу.
pip install isort
isort .
Так выглядели наши импорты до правки:
А так после применения isort:
Так же рекомендую сохранить отредактированный файл.
pre-commit hook
Мы можем запускать black, flake8 и mypy вручную, но это не удобно. Мы можем автоматизировать процесс с помощью pre-commit hook.
Файл .pre-commit-config.yaml
repos: - repo: https://github.com/asottile/pyupgrade rev: v2.19.4 hooks: - id: pyupgrade args: [ "--py38-plus" ] - repo: https://github.com/pre-commit/mirrors-isort rev: 1ba6bfc # Use the revision sha / tag you want to point at hooks: - id: isort args: ["--profile", "black"] - repo: https://github.com/psf/black rev: 21.6b0 hooks: - id: black - repo: https://gitlab.com/pycqa/flake8 rev: 3.9.2 hooks: - id: flake8 language_version: python3 - repo: https://github.com/pre-commit/pre-commit-hooks rev: v4.0.1 hooks: - id: check-docstring-first - id: check-json - id: check-merge-conflict - id: check-yaml - id: debug-statements - id: end-of-file-fixer - id: trailing-whitespace - id: requirements-txt-fixer - repo: https://github.com/pre-commit/mirrors-pylint rev: 56b3cb4 hooks: - id: pylint args: - --max-line-length=120 - --ignore-imports=yes - -d duplicate-code - repo: https://github.com/pre-commit/pygrep-hooks rev: v1.9.0 hooks: - id: python-check-mock-methods - id: python-use-type-annotations - id: python-check-blanket-noqa - id: python-use-type-annotations - id: text-unicode-replacement-char - repo: https://github.com/pre-commit/mirrors-mypy rev: 9feadeb hooks: - id: mypy exclude: ^tests/ args: [ --disallow-untyped-defs, --check-untyped-defs, --warn-redundant-casts, --no-implicit-optional, --strict-optional ]
Теперь каждый коммит будет запускаться наше форматирование и проверки. Теперь сделаем, что бы Github запускал их при каждом pull request.
Github Actions
Для наших целей будем использовать Github Action. Создадим файл ci.yaml
Файл .github/workflows/ci.yaml
name: Python package on: push: branches: [ master ] pull_request: branches: [ master ] jobs: build: runs-on: ubuntu-latest strategy: matrix: python-version: [3.6] steps: - uses: actions/checkout@v2 - name: Set up Python uses: actions/setup-python@v2 with: python-version: $> # You can test your matrix by printing the current Python version - name: Display Python version run: python -c "import sys; print(sys.version)" - name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements_dev.txt - name: Run black run: black --check . - name: Run flake8 run: flake8 - name: Run Mypy run: mypy pandaseda
Основное внимание обратите на:
- name: Install dependencies run: | python -m pip install --upgrade pip pip install -r requirements_dev.txt - name: Run black run: black --check . - name: Run flake8 run: flake8 - name: Run Mypy run: mypy pandaseda
Тут указаны наши проверки. Black тут запускаем с флагом check. Black не будет редактировать код, но выполнит проверку. Именно поэтому лучше сохранить файл после запуска black заранее.
Action теперь готов, его можно запустить при любом коммите. После запуска можно посмотреть ход выполнения и результат во вкладке Action.
В случае ошибок на почту будет отправлен email:
Саму ошибку можно так же посмотреть в Action:
Заключение
В этой заметке получилось рассмотреть несколько библиотек для работы с вашим кодом. Отдельно рассмотрели pre-commit hook и Github Actions.
Дополнительный материал
- Документация по GitHub Actions
- isort
- Документация по mypy
- Стильный код на Python, или учимся использовать Flake8
- black
Три простых способа заметно улучшить ваш код на Python
Этот пост будет коротким и по существу. Вот три простых и действенных способа, с помощью которых я заметно улучшил свой код на Python, при этом сделал это с минимальными усилиями.
Експертний курс від skvot: Unreal Еngine: від інтерфейсу до запуску гри.
Запустіть свою гру з Unreal.
Итак, вот что я начал делать нового:
- Прислушивался к советам линтера.
- Использовал прекоммит.
Професійний курс від laba: Проджект-менеджмент в ІТ.
Ефективне управління проектами.
Я знаю, что некоторые читатели знакомы с этими тремя техниками — хотя в начале 2021 года я не был знаком с ними, и я хотел поделиться с теми, кто начал этот год в похожем положении новичка.
SonarLint
SonarLint – мой любимый линтер. Это бесплатное расширение не только обнаружило проблемы в моем коде, но и предоставило документацию и примеры по каждой выявленной проблеме. Поскольку оно интегрируется в VS Code и PyCharm, было очень легко принять решение включить его в мой рабочий процесс для повышения качества кода. Благодаря этому я узнал, когда следует использовать оператор else после цикла for или while , использовать элементы управления итерациями в блоках try/except , а также потратил много времени на уменьшение сложности и увеличение наглядности моих методов.
Документация и расширение здесь: https://www.sonarlint.org/
Pre-commit
Этот инструмент позволяет стандартизировать проверку качества кода перед тем, как сохранить и поделиться своими изменениями. Он невероятно полезен и предоставляет метод для выполнения статического анализа кода. С помощью простой конфигурации я могу использовать black для форматирования кода, isort для сортировки импортов, mypy для проверки на проблемы с типизацией (подробнее об этом чуть позже), flake8 для поиска стилистических ошибок и нарушений конвенций кода, и многие другие проверки.
Документация об этом: https://pre-commit.com/
repos: - repo: https://github.com/pre-commit/pre-commit-hooks rev: v2.3.0 hooks: - id: check-yaml - id: end-of-file-fixer - id: trailing-whitespace - repo: https://github.com/psf/black rev: 19.3b0 hooks: - id: black - repo: https://github.com/pycqa/isort rev: 5.10.1 hooks: - id: isort name: isort (python) - repo: https://github.com/pre-commit/mirrors-mypy rev: 'v0.910-1' hooks: - id: mypy - repo: https://github.com/pycqa/flake8 rev: '4.0.1' hooks: - id: flake8
Я с нетерпением жду возможности узнать больше об этом и, возможно, поделиться своими собственными pre-commit hooks .
Горячая подсказка типа
Это работает рука об руку с pre-commit. После внедрения проверок mypy в pre-commit я потратил время на доработку существующего кода для использования подсказок типов, чтобы mypy мог использовать этот контекст и искать возможные ошибки. Документация по типизации в Python превосходна и помогла определить, как и когда использовать различные классы типизации.
Творчий курс від skvot: 3D-художник персонажів.
Створюйте світ персонажів.
Одним из моих любимых является класс TypedDict . Он позволяет определять структурированные словари с необходимыми ключами и значениями. С его помощью мы можем определять структуру данных JSON , которые мы передаем между классами. Это, безусловно, позволило мне более надежно создавать интерфейсы и стандартизированные структуры для обмена данными между программами и системами.
Быстрый пример ниже:
from typing import List, TypedDict class Weather(TypedDict): high_temp: float low_temp: float summary: str forecast: List[Weather] = [< "high_temp": 40.3, "low_temp": 34.7, "summary": "Sunny" >]
Что дальше?
Я надеюсь в этом году узнать больше о новых темах, хотя я уверен, что в следующем году я буду писать о том, о чем сейчас не знаю.
Мои планы таковы:
- Изучить внедрение методов функционального программирования и сокращение использования ненужных побочных эффектов.
- Погрузиться в JavaScript и узнать больше о фронт-энде и асинхронной разработке.
- Развитие навыков работы с инструментами DevOps, такими как ansible, terraform и packer.
А какие техники вы переняли в этом году? Что вы надеетесь развить в этом году? Пишите тут в комментах, или в наших социальных сетях.
Обзор инструментов для автоформатирования кода Python
Благодаря легко читаемому и понятному синтаксису Python вполне обоснованно стал самым востребованным языком программирования на сегодняшний день. Области его применения настолько разнообразны, что программная инженерия, машинное обучение и наука о данных используют его для решения самых разных сложных задач.
Один из немаловажных, но оставленных без должного внимания аспектов в написании чистого кода Python заключается в необходимости его качественного форматирования и проверок.
Достаточно сказать, что автоматизация коснулась всех сторон современной жизни, и нам не составит особого труда привнести ее и в процесс ревью кода.
В нашем распоряжении есть несколько инструментов, позволяющих сэкономить драгоценное время и умственную энергию, чтобы вложить их в более важные дела, чем форматирование кода перед каждым git commit .
Перечислим некоторые из них:
- хуки pre-commit ;
- black ;
- isort .
Рассмотрим поочередно каждый инструмент и научимся настраивать их для проекта Python.
Установка и применение хуков pre-commit
Хуки pre-commit делают ровно то, что указано в названии: запускают определенные скрипты, которые проверяют код на наличие ошибок и конечных пробелов, активируют инструменты форматирования и проводят другие полезные проверки в процессе ревью.
Мы исключим из сферы нашего внимания обычные хуки, а сосредоточимся только на двух важных из них.
Начнем с установки библиотеки (учитывая, что вы уже работаете в виртуальной среде):
pip install pre-commit
После установки проверяем версию с помощью данной команды. Если все работает должным образом, на выводе получаем номер версии.
$ pre-commit --versionpre-commit 2.17.0
Примечание. Для простой настройки инструментов автоформатирования необходимо наличие конфигурационного файла git в корневом каталоге проекта.
Именно этим мы сейчас и займемся.
Настройка конфигурационного файла
Согласно документации в проекте должен быть конфигурационный файл pre-commit с именем .pre-commit-config.yaml .
Теперь воспользуемся фрагментом кода с информацией о хуках, с которыми мы хотим работать. Прямо сейчас мы намерены запустить 2 из них: black и isort в файлах Python перед каждым коммитом.
А вот и их настройки:
repos:
- repo: https://github.com/pre-commit/pre-commit-hooks
rev: v2.3.0
hooks:
- id: check-yaml
- id: end-of-file-fixer
- id: trailing-whitespace
- repo: https://github.com/psf/black
rev: 21.12b0
hooks:
- id: black
- repo: https://github.com/pycqa/isort
rev: 5.10.1
hooks:
- id: isort
name: isort (python)
Проведем построчный анализ:
- Строки 5–7: Первая строка id пытается загрузить все файлы yaml для проверки синтаксиса; вторая — следит за тем, чтобы файлы заканчивались переводом строки и только одним; третья — проверяет наличие конечных пробелов.
- Строки 8–10: Настройка хука для black , который автоматически форматирует код Python и широко применяется во всей индустрии.
- Строки 12–16: Настройка для библиотеки isort , которая автоматически сортирует импорты в коде, избавляя программистов от необходимости делать это вручную.
С помощью следующей команды присоединяем их к конфигурации git , чтобы обеспечить их запуск перед каждым коммитом:
$ pre-commit install
pre-commit installed at .git/hooks/pre-commit
Без особых усилий мы успешно настроили хуки pre-commit для проекта!
Переходим к настройке black и isort . К счастью, для этого потребуется всего один конфигурационный файл.
Установка и настройка black и isort
Легко и просто устанавливаем эти две библиотеки:
pip install black isort
Из отлично написанной документации мы узнаем о назначении Black :
Black ускоряет процесс ревью кода, производя минимальные возможные различия. Код, отформатированный в Black , выглядит одинаково независимо от проекта, который вы читаете. Со временем принципы форматирования становятся понятными, что позволяет сосредоточиться на содержании.
isort также просто определяет области своего применения:
isort — это утилита/библиотека Python для сортировки импорта по алфавиту с автоматическим разделением на разделы и по типам.
Для настройки потребуется всего один файл pyproject.toml .
Размещаем в нем следующий контент:
[tool.black]
line-length = 109
target-version = ['py37']
[tool.isort]
profile = "black"
Вы можете менять не только длину строки в соответствии с личными или рабочими предпочтениями, но и другие настраиваемые переменные, предлагаемые Black .
Теперь поясним, почему мы непосредственно задействуем этот конкретный файл:
PEP 518 определяет pyproject.toml как конфигурационный файл, содержащий требования к системе сборки для проектов Python.
На практике данный файл в корневом каталоге проекта позволяет использовать “глобальную” конфигурацию проверки/ревизии кода для всего проекта.
Приступаем к их тестированию!
Тестирование хуков pre-commit
Написав или отредактировав код в нескольких файлах, выполняем дальнейшую последовательность простых действий, чтобы протестировать работоспособность прикрепленных хуков.
Сначала добавляем файлы или их комбинацию с помощью команды git add . в терминале.
Я провожу тестирование в одном из моих текущих проектов Django.
Выполняем git commit -m “a message here” и видим следующий результат:
Это значит, что файлы были изменены путем форматирования, выполненного хуком pre-commit .
При выполнении команды git status получаем следующее сообщение:
Файл views.py содержит несколько строк, измененных в результате выполнения хуков. Их следует просмотреть.
Так мы убедимся, что измененные файлы не будут автоматически зафиксированы. Это позволит просмотреть их еще раз и проверить корректность всех изменений.
В качестве преднамеренного шага pre-commit никогда не изменит область staging (подготовки к коммиту) версионного кода. Поскольку любой запускаемый хук может содержать ошибки, исправление которых после совершенного коммита обернется головной болью, нам предоставляется дополнительная возможность еще раз проверить и убедиться, что все в порядке.
Снова добавляем и фиксируем изменения в файлах:
git add .
git commit -m "your message here"
Итак, мы успешно зафиксировали внесенные в код изменения!
Заключение
Надеюсь, это краткое руководство дало вам представление о том, как использовать хуки pre-commit для автоформатирования без усилий и ручного вмешательства.
Полезные ресурсы
- Black docs
- isort docs
- Pre-commit hooks docs
- A GitHub issue that explains why that additional commit step is so necessary.
Благодарю за внимание! 🙂
- Работа с панелью индикаторов. Руководство программиста Python. Часть 3
- Внимание: работает пакет Python Tweepy!
- Осваиваем веб-скрэпинг на Python