Игра Яндекс Практикума
Игра Яндекс Практикума
Игра Яндекс Практикума

10 пакетов Python, которые улучшат вашу кодовую базу

Нашли 10 топовых инструментов для программирования на Python, которые сделают код чище и эффективнее.

15К открытий58К показов
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. Тем самым вы экономите свое время и силы для более важных дел.

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

Для установки вводим в командную строку:

			pip install black
		

А чтобы сразу приступить к работе с дефолтными настройками, прописываем:

			black {source_file_or_directory}
		
10 пакетов Python, которые улучшат вашу кодовую базу 1
Неотформатированный и отформатированный с помощью 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)  
		

Вывод будет такой:

10 пакетов Python, которые улучшат вашу кодовую базу 2

Pydantic

Популярная библиотека для проверки данных и управления настройками. Внутри — интуитивно понятный синтаксис и user-friendly инструменты, которые проверяют данные на достоверность и соответствие заданным типам и ограничениям.

Pydantic определяет структуру данных декларативным способом с помощью аннотаций типов Python, а также использует схему JSON для интеграции инструментов и проверяет стандартные типы библиотек с помощью TydepDicts.

Вот простой пример, как работает Pydantic:

10 пакетов Python, которые улучшат вашу кодовую базу 3
Код без использования 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:

10 пакетов Python, которые улучшат вашу кодовую базу 4

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)
...

		
10 пакетов Python, которые улучшат вашу кодовую базу 5
Пример кода автора 
			pydocstyle demo.py
		

Вывод будет следующий:

10 пакетов Python, которые улучшат вашу кодовую базу 6

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
		

Вот какой результат выдал «Бандит»:

10 пакетов Python, которые улучшат вашу кодовую базу 7

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.

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

Следите за новыми постами
Следите за новыми постами по любимым темам
15К открытий58К показов