Правила Ruff, связанные с pyflakes (F)

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

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

Ruff unused-import (F401)

unused-import в Ruff проверяет наличие неиспользуемых импортов.

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

Неиспользуемые импорты создают лишнюю нагрузку на производительность во время выполнения и могут привести к возникновению циклических зависимостей. Они также усложняют чтение кода.

Если оператор import используется для проверки доступности модуля, вместо этого используйте importlib.util.find_spec.

Если импорт предназначен для …

Ruff import-shadowed-by-loop-var (F402)

import-shadowed-by-loop-var в Ruff проверяет случаи, когда переменная цикла затеняет импорт.

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

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

Рекомендуется использовать другое имя …

Ruff undefined-local-with-import-star (F403)

undefined-local-with-import-star в Ruff проверяет использование глобального импорта с подстановочным символом (*).

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

Глобальный импорт (например, from module import *) усложняет определение того, какие символы доступны в текущем пространстве имен и из какого модуля они были импортированы. Такой стиль импорта также не рекомендуется согласно PEP 8.

Вместо этого указывайте явно, какие …

Ruff late-future-import (F404)

late-future-import в Ruff проверяет, что импорты из __future__ располагаются в начале файла.

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

Импорты из __future__ должны быть размещены в начале файла, перед любыми другими операторами (за исключением строк документации). Использование __future__-импорта в другом месте является некорректным и приведёт к SyntaxError.

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

from pathlib import Path

from …

Ruff undefined-local-with-import-star-usage (F405)

undefined-local-with-import-star-usage в Ruff проверяет использование имён, которые могут быть неопределёнными, но также могут быть импортированы с использованием глобального импорта (*).

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

Глобальный импорт (например, from module import *) затрудняет определение доступных символов в текущем пространстве имен. Если модуль содержит глобальный импорт, а имя в текущем пространстве имен не было явно …

Ruff undefined-local-with-nested-import-star-usage (F406)

undefined-local-with-nested-import-star-usage в Ruff проверяет использование глобального импорта (*) вне пространства имен модуля.

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

Использование глобального импорта вне пространства имен модуля (например, внутри функций) может привести к путанице, так как импорт может затенять локальные переменные.

Хотя PEP 8 не рекомендует использовать глобальные импорты, если это необходимо, их следует размещать в …

Ruff future-feature-not-defined (F407)

future-feature-not-defined в Ruff проверяет, что импортируемые из __future__ модуля функции определены в текущей версии Python.

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

Импортирование неопределённых или неподдерживаемых элементов из модуля __future__ приведёт к SyntaxError.

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

from __future__ import nonexistent_feature

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

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

from __future__ …

Ruff percent-format-invalid-format (F501)

percent-format-invalid-format в Ruff проверяет наличие некорректных строковых форматов в стиле printf.

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

Форматные строки в стиле printf требуют наличия спецификаторов преобразования. Эти спецификаторы должны содержать символ % с последующим указанием типа преобразования.

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

"Hello, %" % "world"

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

"Hello, %s" % "world"

Ruff percent-format-expected-mapping (F502)

percent-format-expected-mapping в Ruff проверяет использование именованных заполнителей в строковых форматах printf без значений типа отображения.

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

При использовании именованных заполнителей в строках формата printf значения должны быть типа "mapping" (например, словарём). В противном случае выражение вызовет TypeError.

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

"%(greeting)s, %(name)s" % ("Hello", "World")

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

"%(greeting …

Ruff percent-format-expected-sequence (F503)

percent-format-expected-sequence в Ruff проверяет использование значений типа "mapping" (например, словарей) в строковых форматах printf без именованных заполнителей.

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

При использовании значений типа "mapping" (например, словаря) в строках формата printf ключи должны быть именованными. В противном случае выражение вызовет TypeError.

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

"%s, %s" % {"greeting": "Hello", "name": "World"}

Как …

Ruff percent-format-extra-named-arguments (F504)

percent-format-extra-named-arguments в Ruff проверяет неиспользуемые ключи в словарях, передаваемых в строковые форматы printf.

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

Неиспользуемые именованные заполнители в строковых форматах printf избыточны и, скорее всего, указывают на ошибку. Их следует удалить.

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

"Hello, %(name)s" % {"greeting": "Hello", "name": "World"}

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

"Hello, %(name)s" % {"name": "World"}

Ruff percent-format-missing-argument (F505)

percent-format-missing-argument в Ruff проверяет именованные заполнители в строках формата printf, для которых отсутствуют соответствующие значения в переданном словаре.

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

Именованные заполнители, для которых нет соответствующих значений в переданном словаре, вызовут KeyError во время выполнения.

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

"%(greeting)s, %(name)s" % {"name": "world"}

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

"Hello, %(name)s" % {"name …

Ruff percent-format-mixed-positional-and-named (F506)

percent-format-mixed-positional-and-named в Ruff проверяет использование смешанных позиционных и именованных заполнителей в строках формата printf.

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

Python не поддерживает смешивание позиционных и именованных заполнителей в строках формата printf. Использование смешанных заполнителей вызовет TypeError во время выполнения.

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

"%s, %(name)s" % ("Hello", {"name": "World"})

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

"%s, %s" % ("Hello …

Ruff percent-format-positional-count-mismatch (F507)

percent-format-positional-count-mismatch в Ruff проверяет несоответствие между количеством позиционных заполнителей и числом переданных значений в строках формата printf.

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

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

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

"%s, %s" % ("Hello", "world", "!")

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

"%s, %s …

Ruff percent-format-star-requires-sequence (F508)

percent-format-star-requires-sequence в Ruff проверяет использование спецификатора * в строках формата printf с некортежными значениями.

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

Использование спецификатора * с некортежными значениями вызовет TypeError во время выполнения.

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

from math import pi

"%(n).*f" % {"n": (2, pi)}

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

from math import pi

"%.*f" % (2, pi)  # 3.14

Ruff percent-format-unsupported-format-character (F509)

percent-format-unsupported-format-character в Ruff проверяет строки формата printf на наличие недопустимых символов формата.

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

В строках формата printf символ % используется для обозначения заполнителей. Если после % следует недопустимый символ формата, это вызовет ValueError во время выполнения.

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

"Hello, %S" % "world"

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

"Hello, %s" % "world"