Что такое магические числа и почему их нужно выносить в отдельные переменные
Что проверяют
Понимаете ли вы, что читаемость это инженерное требование, а не вкусовщина, и умеете ли провести границу: какие литералы выносить, а какие спокойно оставить на месте.
Как отвечать
Магическое число это литерал в коде без объяснения смысла. Из строки if len(items) > 100: не видно, почему именно сто и что сломается, если поменять.
Что даёт именованная константа: смысл читается из имени, правка делается в одном месте, значение легко переопределить из настроек и подменить в тесте.
В Python это константа модуля в верхнем регистре, для связанных наборов Enum, для неизменяемости подсказка Final:
from typing import Final
MAX_ITEMS_PER_BATCH: Final[int] = 100
RETRY_DELAY_SEC: Final[float] = 0.5
if len(items) > MAX_ITEMS_PER_BATCH:
split(items)Стоит добавить, что защиты от записи язык не даёт: верхний регистр это соглашение, а Final проверяет только статический анализатор.
Выносить имеет смысл всё, о чём кто-то спросит «почему столько». Оставлять можно нейтральные ноль, единицу и минус единицу в очевидном контексте: счётчик и срез в отдельной константе не нуждаются.
Где спотыкаются
Заменяют число буквой и считают дело сделанным. Имя вроде N объясняет не больше самого литерала; работает только то имя, которое называет смысл, а не значение.
Собирают свалку из всех чисел проекта в одном модуле констант. Константа должна лежать рядом с кодом, который ею пользуется, иначе при чтении приходится прыгать между файлами, а при удалении функциональности мусор остаётся навсегда.
Выносят в константу то, что на самом деле настройка. Лимит и таймаут отличаются между окружениями, и если они зашиты в модуль, каждое изменение превращается в релиз. Заодно переизобретают стандартную библиотеку: у числа пи есть math.pi, и своя версия с двумя знаками после запятой это не константа, а ошибка.