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

Isort python как использовать

  • автор:

Cортировка import с isort для Python в Visual Studio Code

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. Взглянем, что же поменялось.

Так выглядел код до правки:

Код до применения black

А так после правки:

Код после применения black

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

isort

isort — это библиотека Python для сортировки импорта по алфавиту с автоматическим разделением на разделы и по типу.

pip install isort
isort .

Так выглядели наши импорты до правки:

python code before isort

А так после применения isort:

python code after 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.

Github Action

В случае ошибок на почту будет отправлен email:

Github Action email

Саму ошибку можно так же посмотреть в Action:

Github Action Log

Заключение

В этой заметке получилось рассмотреть несколько библиотек для работы с вашим кодом. Отдельно рассмотрели 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

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

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