Нашли 10 топовых инструментов для программирования на Python, которые сделают код чище и эффективнее.
Data Scientist’ы и разработчики тратят немало времени на отладку кода, чтобы сделать его более эффективным и простым в дальнейшем использовании. Пользователь Medium нашел 10 пакетов Python, которые повысили его продуктивность в работе. Рассказываем, как они помогают автоматизировать форматирование кода и тестировать его на выявление ошибок на первых этапах.
Black
Это инструмент, который одновременно выявляет ошибки и форматирует код на Python. В сообществе питонистов уже давно есть PEP8, оформляющий код в едином стиле, и пойти против него — практически преступление. Black менее красивый, но при этом более консистентный, плюс его нельзя конфигурировать. Об этом даже написано в readme.md пакета:
By using it, you agree to cede control over minutiae of hand-formatting. In return, Black gives you speed, determinism, and freedom from pycodestyle nagging about formatting. You will save time and mental energy for more important matters.
Используя его, вы соглашаетесь больше не контролировать форматирование вручную. Взамен Black «обещает» скорость, определенность и свободу от придирчивого отношения к стилю pycodestyle. Тем самым вы экономите свое время и силы для более важных дел.
Форматирование кода крайне важно при работе над крупными проектами и в больших командах — код будет в разы проще читать, равно как и выявлять ошибки.
В Python 3.13.0a6 нашли встроенный JIT-компиляторtproger.ru
Для установки вводим в командную строку:
pip install black
А чтобы сразу приступить к работе с дефолтными настройками, прописываем:
black {source_file_or_directory}
Неотформатированный и отформатированный с помощью Black код
MyPy
MyPy — инструмент статической проверки типов, который поддерживает и динамическую типизацию (duck typing). Он помогает выявлять ошибки несоответствия типов в коде до его выполнения, повышает надежность программы, а еще — поддерживает другие библиотеки и разные режимы проверки типов.
Для установки вводим:
pip install mypy
Пример кода с ошибками, который проверяет работу MyPy:
from typing import List, Tuple def greet(name: int) -> str: return f"Hello, {name}!" def add(x: int, y: str) -> int: return x + y def average(numbers: List[int]) -> float: total = sum(numbers) return total / len(numbers) def get_person() -> Tuple[str, int]: return "Robert", "twenty-two" print(greet("Dave")) print(add(20, 21)) print(average([3, 2, 4, "4"])) age = get_person()[1] print(age + 10)
Вывод будет такой:
Pydantic
Популярная библиотека для проверки данных и управления настройками. Внутри — интуитивно понятный синтаксис и user-friendly инструменты, которые проверяют данные на достоверность и соответствие заданным типам и ограничениям.
Pydantic определяет структуру данных декларативным способом с помощью аннотаций типов Python, а также использует схему JSON для интеграции инструментов и проверяет стандартные типы библиотек с помощью TydepDicts.
Вот простой пример, как работает Pydantic:
Код без использования Pydantic и с ним
Здесь можно увидеть, как использование библиотеки Pedantic уменьшило размер кода и сделало его более понятным за счет того, что в нежелательном кастомном методе validate()
особо нет необходимости.
Hypothesis
Это мощная библиотека Python для property-based тестирования, которая генерирует тестовые данные в соответствии с определенными правилами (strategies). Основная идея заключается в том, чтобы задать общие свойства программы, а Hypothesis автоматически сгенерирует множество входных данных для проверки этих свойств.
Библиотека интегрируется со многими популярными утилитами для тестирования, например, с pytest и unittest.
Установка:
pip install hypothesis
Вот пример простого кода с ошибкой деления на 0, которую проверяет «Гипотеза»:
from hypothesis import given, strategies as st def divide(x, y): return x/y @given(x=st.integers(), y=st.integers()) def test_divide(x, y): assert divide(x, y) == x/y if __name__ == "__main__": test_divide()
Тест выдаст следующее:
test.py::test_divide FAILED [100%] test.py:7 (test_divide) @given(x=st.integers(), y=st.integers()) > def test_divide(x, y): test.py:9: _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ test.py:10: in test_divide assert divide(x, y) == x/y _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ x = 0, y = 0 def divide(x, y): > return x/y E ZeroDivisionError: division by zero E Falsifying example: test_divide( E x=0, # or any other generated value E y=0, E ) test.py:5: ZeroDivisionError ============================== 1 failed in 0.62s =============================== Process finished with exit code 1
Pre-commit
Классный фреймворк Python для управления многоязычными прекоммитами и их поддержки. Он определяет набор проверок и преобразований, которые выполняются в вашем коде автоматически перед каждым коммитом.
Для установки:
pip install pre-commit1
Вот как это работает:
- Создаем файл .pre-commit-config.yaml в корневой структуре проекта:
repos: - repo: https://github.com/abhayparashar31/IPL rev: v4.4.0 hooks: - id: trailing-whitespace - id: end-of-file-fixer - id: check-yaml - repo: https://github.com/psf/black rev: 23.3.0 hooks: - id: black
- Устанавливаем скрипты Git-хуков:
pre-commit install
- Сам коммит-код:
git commit -m "Your commit message!!!"
Pre-commit автоматически проверит код на ошибки и исправит их.
Vulture
Пакет Python, который выявляет мертвый код в ваших проектах и выдает подробный отчет.
Мертвый код — код, который никогда не использовался и не выполнялся, он может накапливаться с течением времени, но при этом не несет никакой пользы.
Устанавливаем:
pip install vulture
Работает это так:
---- demo.py def used_function(): return "I'm used! 🤚" def unused_function(): return "I'm never called! ⛔" used_variable = used_function() unused_variable = "I'm defined but never used 🤙" print(used_variable)
vulture demo.py ----------O/P example.py:4: unused function 'unused_function' (60% confidence) example.py:8: unused variable 'unused_variable'
Isort
Утилита командной строки и одновременно библиотека, которая упрощает жизнь разработчикам. Она сортирует import Python — упорядочивает и делает его более читабельными, группируя по типу (стандартная библиотека, сторонние и локальные) и выстраивая в алфавитном порядке внутри каждой группы.
Для установки:
pip install isort
Пример до и после использования Isort:
PyDocstyle
Утилита проверяет, соответствует ли ваши docstrings стандарту PEP 257. Это стиль, который упорядочивает высокоуровневую структуру таких строк — что они должны содержать и как их писать (при этом он не затрагивает синтаксис в самих строках).
Для установки:
pip install pydocstyle
Затем пишем это и проверяем свой код:
$ pydocstyle test.py test.py:18 in private nested class `meta`: D101: Docstring missing test.py:27 in public function `get_user`: D300: Use """triple double quotes""" (found '''-quotes) test:75 in public function `init_database`: D201: No blank lines allowed before function docstring (found 1) ...
Пример кода автора
pydocstyle demo.py
Вывод будет следующий:
Bandit
Программа проверяет безопасность кода. Она ищет наиболее частые проблемы в приложениях на Python.mlt, анализирует AST (абстрактное синтаксическое дерево) и запускает набор плагинов для выявления ошибок.
Код, который проверял автор статьи на ошибки безопасности:
import pickle import subprocess def unsafe_deserialization(data): return pickle.loads(data) def command_injection(user_input): subprocess.call("echo " + user_input, shell=True) password = "hardcoded_password" def get_password(): return password
Вот какой результат выдал «Бандит»:
Radon
Пакет Python, который анализирует исходный код и вычисляет различные метрики, включая Cyclomatic Complexity (CC), Maintainability Index (MI), Raw metrics (SLOC, комментарии, пустые строки), и Halstead metrics. Radon помогает найти слишком сложные части кода, которые можно упростить, а также выдает отчеты для документирования и проверки кода. Пакет особенно полезен в больших проектах, когда код должен быть качественным, отлаженным и системным.
Устанавливаем:
pip install radon
Код, который автор статьи тестировал на сложность:
def complex_function(a, b, c): if a > 0: if b > 0: for i in range(c): if i % 2 == 0: print("Even") else: print("Odd") else: while b < 0: b += 1 if b == -1: break elif a < 0: if c > 0: return c else: return -c else: return b def simple_function(): return "Hello, World!"
Для теста: random cc code.py
complex_function.py F 1:0 complex_function - B (9) F 23:0 simple_function - A (1)
Чтобы эффективнее использовать Radon, можно создать файл конфигурации random.cfg — так будет проще управлять действиями пакета:
[radon] exclude = tests/*,scrapers/* cc_min = A mi_min = B
Эта конфигурация исключает определенные каталоги и устанавливает минимальные пороговые значения для Cyclomatic Complexity and Maintainability Index.
Конечно, это далеко не все фичи, которые будут действительно полезны питонистам. Если у вас есть другие крутые решения — приносите в комментарии.