Правила Ruff, связанные с pycodestyle (E, W)

Правила Ruff, связанные с pycodestyle. Подробнее об этом плагине на его странице PyPI

Часть категории Правила проверок кода в Ruff.

Ruff missing-newline-at-end-of-file (W292)

missing-newline-at-end-of-file в Ruff проверяет отсутствие новой строки в конце файла.

Почему это неправильно

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

Пример ошибки

spam(1)  # Нет новой строки в конце файла.

Как правильно

spam(1 …

Ruff blank-line-with-whitespace (W293)

blank-line-with-whitespace в Ruff проверяет наличие лишних пробелов в пустых строках.

Почему это неправильно

Согласно PEP 8, "избегайте замыкающих пробелов в любом месте. Так как они обычно невидимы, это может сбивать с толку".

Лишние пробелы в пустых строках не несут полезной информации и могут вызвать нежелательные эффекты в системах контроля версий …

Ruff too-many-newlines-at-end-of-file (W391)

too-many-newlines-at-end-of-file в Ruff проверяет файлы с несколькими пустыми строками в конце.

Почему это неправильно

Пустые строки в конце файла избыточны.

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

В случае Jupyter Notebook эта проверка применяется к каждой ячейке отдельно.

Пример …

Ruff doc-line-too-long (W505)

doc-line-too-long в Ruff проверяет строки документации, превышающие установленную максимальную длину символов.

Почему это неправильно

Длинные строки в блоках документации (docstrings или комментариях) ухудшают читаемость кода. Например, PEP 8 рекомендует ограничивать такие строки 72 символами.

Это правило применяет ограничение, заданное в настройке lint.pycodestyle.max-doc-length. Если значение не указано, правило не …

Ruff invalid-escape-sequence (W605)

invalid-escape-sequence в Ruff проверяет недопустимые escape-последовательности.

Почему это неправильно

Недопустимые escape-последовательности были объявлены устаревшими в Python 3.6 и могут приводить к неожиданному поведению кода.

Пример ошибки

regex = "\.png$"  # Ошибочная escape-последовательность.

Как правильно

regex = r"\.png$"  # Использование сырой строки (raw string).

Если строка уже содержит корректную escape-последовательность:

value = "new line …

Ruff mixed-spaces-and-tabs (E101)

mixed-spaces-and-tabs в Ruff проверяет случаи, когда в отступах смешиваются пробелы и табуляции.

Почему это неправильно

Никогда не смешивайте пробелы и табуляции.

Наиболее популярный способ оформления отступов в Python — использование только пробелов. Второй по популярности — использование только табуляции. Код, в котором смешаны пробелы и табуляции, следует привести к единому стилю с …

Ruff multiple-imports-on-one-line (E401)

multiple-imports-on-one-line в Ruff проверяет случаи, когда несколько модулей импортируются в одной строке.

Почему это неправильно

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

Пример ошибки

import sys, os

Как правильно

import os
import sys

Ruff module-import-not-at-top-of-file (E402)

module-import-not-at-top-of-file в Ruff проверяет случаи, когда импорты расположены не в начале файла.

Почему это неправильно

Согласно PEP 8, "импорты всегда должны находиться в начале файла — сразу после комментариев модуля и docstring, перед глобальными переменными и константами".

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

Исключения составляют …

Ruff line-too-long (E501)

line-too-long в Ruff проверяет строки, превышающие установленную максимальную длину символов.

Почему это неправильно

Слишком длинные строки ухудшают читаемость кода. PEP 8 рекомендует ограничивать строки 79 символами. По умолчанию это правило в Ruff использует лимит 88 символов для совместимости с Black и Ruff Formatter, но этот лимит можно настроить через параметр …

Ruff multiple-statements-on-one-line-colon (E701)

multiple-statements-on-one-line-colon в Ruff проверяет случаи, когда несколько операторов записаны в одной строке.

Почему это неправильно

Согласно PEP 8, "сложные операторы (несколько операторов в одной строке) обычно не рекомендуются". Размещение нескольких операторов в одной строке ухудшает читаемость кода и делает его сложнее для понимания.

Пример ошибки

if foo == "blah": do_blah_thing()

Как …

Ruff multiple-statements-on-one-line-semicolon (E702)

multiple-statements-on-one-line-semicolon в Ruff проверяет случаи, когда несколько операторов записаны в одной строке через точку с запятой.

Почему это неправильно

Согласно PEP 8, размещение нескольких операторов в одной строке не рекомендуется, так как это ухудшает читаемость кода и затрудняет его поддержку.

Пример ошибки

do_one(); do_two(); do_three()

Как правильно

do_one()
do_two()
do_three …

Ruff useless-semicolon (E703)

useless-semicolon в Ruff проверяет операторы, заканчивающиеся ненужной точкой с запятой.

Почему это неправильно

Заключительная точка с запятой в Python не требуется и должна быть удалена, так как она не несет никакой функциональной нагрузки.

Пример ошибки

do_four();  # лишняя точка с запятой

Как правильно

do_four()

Ruff none-comparison (E711)

none-comparison в Ruff проверяет сравнения с None, выполненные без использования оператора is.

Почему это неправильно

Согласно PEP 8, "сравнения с одиночными значениями, такими как None, всегда должны выполняться с использованием is или is not, а не операторов равенства (== или !=).

Пример ошибки

if arg != None:
    pass
if None == arg:
    pass

Как …

Ruff true-false-comparison (E712)

true-false-comparison в Ruff проверяет сравнение с логическими литералами True и False с использованием операторов равенства (== и !=).

Почему это неправильно

Согласно PEP 8, не следует использовать == и != для проверки значений на True или False.

Вместо этого следует использовать if cond: или if not cond: для проверки истинности значений.

Если необходимо проверить …

Ruff not-in-test (E713)

not-in-test в Ruff проверяет использование проверки членства с not {element} in {collection}.

Почему это неправильно

Согласно PEP 8, конструкция {element} not in {collection} является более читаемой, чем not {element} in {collection}.

Пример ошибки

Z = not X in Y
if not X.B in Y:
    pass

Как правильно

Z = X not …

Ruff not-is-test (E714)

not-is-test в Ruff проверяет сравнение идентичности объектов с использованием not {foo} is {bar}.

Почему это неправильно

Согласно PEP 8, проверка идентичности объекта с is not более читаема и понятна.

Пример ошибки

if not X is Y:
    pass
Z = not X.B is Y

Как правильно

if X is not Y …

Ruff type-comparison (E721)

type-comparison в Ruff проверяет сравнение типов объектов с использованием == и других операторов сравнения.

Почему это неправильно

Использование isinstance вместо прямого сравнения типов предпочтительно, поскольку оно также проверяет, является ли объект экземпляром класса или его подкласса.

Если необходимо проверить точное соответствие типа, следует использовать is или is not.

Известные проблемы

При …

Ruff bare-except (E722)

bare-except в Ruff проверяет блоки try-except, которые используют пустой except: без указания конкретного исключения.

Почему это неправильно

Использование пустого except: перехватывает BaseException, включая KeyboardInterrupt, SystemExit, Exception и другие исключения. Это затрудняет прерывание программы (например, с помощью Ctrl-C) и может скрывать серьезные ошибки.

Пример ошибки

try:
    raise KeyboardInterrupt("Вы, вероятно, не …

Ruff lambda-assignment (E731)

lambda-assignment в Ruff проверяет присвоение лямбда-выражений переменным.

Почему это неправильно

Согласно PEP 8, следует «всегда использовать оператор def вместо оператора присваивания, который связывает лямбда-выражение напрямую с идентификатором».

Использование def дает более читаемые трассировки ошибок, а сам оператор присваивания нивелирует главное преимущество использования лямбда-выражения — его встраиваемость в другие выражения.

Пример ошибки …

Ruff ambiguous-variable-name (E741)

ambiguous-variable-name в Ruff проверяет использование переменных с именами l, O или I.

Почему это неправильно

В некоторых шрифтах эти символы неотличимы от цифр 1 и 0, что может затруднить чтение кода и привести к ошибкам.

Пример ошибки

l = 0
O = 123
I = 42

Как правильно

L = 0
o = 123
i …

Ruff ambiguous-class-name (E742)

ambiguous-class-name в Ruff проверяет использование символов 'l', 'O' или 'I' в именах классов.

Почему это неправильно

В некоторых шрифтах эти символы неотличимы от цифр один и ноль, что может вызывать путаницу при чтении кода. Вместо 'I' рекомендуется использовать более явные названия.

Пример ошибки

class I(object):
    pass

Как правильно

class …

Ruff ambiguous-function-name (E743)

ambiguous-function-name в Ruff проверяет использование символов 'l', 'O' или 'I' в качестве имен функций.

Почему это неправильно

В некоторых шрифтах эти символы неотличимы от цифр 1 и 0, что может ухудшить читаемость кода и привести к путанице.

Пример ошибки

def l(x):
    ...

Как правильно

def long_name(x):
    ...

Ruff tab-indentation (W191)

tab-indentation в Ruff проверяет использование табов для отступов.

Почему это неправильно

Согласно PEP 8, предпочтительнее использовать пробелы вместо табов (если только код уже не использует табы для отступов и требуется сохранить консистентность).

Пример ошибки

\tif x == 1:
\t\tprint("Ошибка: отступы с табами")

Как правильно

if x == 1:
    print("Правильно …

Trailing Whitespace (W291)

trailing-whitespace в Ruff проверяет наличие лишних пробелов в конце строк.

Почему это неправильно

Согласно PEP 8, «избегайте лишних пробелов в любом месте. Поскольку они обычно невидимы, это может быть запутанным».

Пример ошибки

spam(1)
#

Как правильно

spam(1)
#