Найти в Дзене
Merion Academy

Ошибки в программировании на Python

Знаешь, что такое «Магические числа?» (спойлер: к Гарри Поттеру они отношения не имеют) 🍷 if status == 3: send_email() elif status == 7: refund_order() ❓ Что такое 3 и 7? Статусы заказа? Коды ошибок? Разработчик, который писал это полгода назад, уже не вспомнит. А новому - придется гадать. Магическое число - это число, вписанное прямо в код без пояснения, что оно означает. Оно «магическое», потому что его значение понятно только автору (и то не всегда). - Непонятно: читателю кода приходится искать документацию или лезть в историю коммитов - Сложно менять: если число используется в 10 местах, а значение поменялось - правь везде, и не ошибись - Легко сломать: случайно перепутал 3 и 4 - и логика поехала ORDER_STATUS_PENDING_REFUND = 3 if order_status == ORDER_STATUS_PENDING_REFUND: process_refund() from enum import IntEnum class OrderStatus(IntEnum): CREATED = 1 PAID = 2 PENDING_REFUND = 3 REFUNDED = 4 if order.status == OrderStatus.PENDING_REFUND: process_refund() Так что если числ
Оглавление

Привет, на связи Merion Academy - платформа доступного IT образования!

Знаешь, что такое «Магические числа?» (спойлер: к Гарри Поттеру они отношения не имеют) 🍷

Знакомая картина?

if status == 3:
send_email()
elif status == 7:
refund_order()

❓ Что такое 3 и 7? Статусы заказа? Коды ошибок? Разработчик, который писал это полгода назад, уже не вспомнит. А новому - придется гадать.

Магическое число - это число, вписанное прямо в код без пояснения, что оно означает. Оно «магическое», потому что его значение понятно только автору (и то не всегда).

Почему это плохо:

- Непонятно: читателю кода приходится искать документацию или лезть в историю коммитов

- Сложно менять: если число используется в 10 местах, а значение поменялось - правь везде, и не ошибись

- Легко сломать: случайно перепутал 3 и 4 - и логика поехала

Но это легко исправить, просто вынеси число в константу или enum:

ORDER_STATUS_PENDING_REFUND = 3
if order_status == ORDER_STATUS_PENDING_REFUND:
process_refund()

from enum import IntEnum
class OrderStatus(IntEnum):
CREATED = 1
PAID = 2
PENDING_REFUND = 3
REFUNDED = 4
if order.status == OrderStatus.PENDING_REFUND:
process_refund()

Так что если число не равно 0, 1 или -1 и не очевидно из контекста - не ленись и дай ему имя! 👀

Кстати, другие полезные советы про то как не надо писать код мы давали в ➡️ нашем видео про то как не надо писать код