👩💻 Антипаттерны в Python-коде, которые встречаются даже у опытных
Даже опытные разработчики пишут код, который потом сложно читать, отлаживать и сопровождать. Вот 5 антипаттернов, которые встречаются особенно часто — и что с ними делать.
1. Мутируемые значения по умолчанию
def append_item(item, items=[]):
items.append(item)
return items
Ошибка — items сохраняет состояние между вызовами. Итог — неожиданные данные.
✅ Правильно:
def append_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
2. Импорт всего (`from module import *`)
Так ты теряешь контроль над namespace и рискуешь конфликтами имён. Особенно опасно в больших проектах.
✅ Лучше явно:
from math import sqrt, pi
3. Голый `except:`
try:
do_something()
except:
pass
Так можно «поймать» даже KeyboardInterrupt, и программа зависнет.
✔️ Лучше:
try:
do_something()
except ValueError:
handle()
4. Чрезмерно вложенные list comprehensions
[x for x in lst if x > 0 if x < 100 if x % 2 == 0]
Читаемость? Нулевая.
✅ Явный цикл:
result = []
for x in lst:
if 0 < x < 100 and x % 2 == 0:
result.append(x)
5. Копирование ссылок на изменяемые объекты
data = [{}] * 3
data[0]["a"] = 1
print(data)
Ожидаешь три разных словаря? А получил три ссылки на один и тот же.
✅ Делай так:
data = [{} for _ in range(3)]
🗣️ Запомни: даже если код "работает", это не значит, что он хорош. Следи за чистотой — антипаттерны незаметны, но со временем превращают проект в хаос.
Даже опытные разработчики пишут код, который потом сложно читать, отлаживать и сопровождать. Вот 5 антипаттернов, которые встречаются особенно часто — и что с ними делать.
1. Мутируемые значения по умолчанию
def append_item(item, items=[]):
items.append(item)
return items
Ошибка — items сохраняет состояние между вызовами. Итог — неожиданные данные.
✅ Правильно:
def append_item(item, items=None):
if items is None:
items = []
items.append(item)
return items
2. Импорт всего (`from module import *`)
Так ты теряешь контроль над namespace и рискуешь конфликтами имён. Особенно опасно в больших проектах.
✅ Лучше явно:
from math import sqrt, pi
3. Голый `except:`
try:
do_something()
except:
pass
Так можно «поймать» даже KeyboardInterrupt, и программа зависнет.
✔️ Лучше:
try:
do_something()
except ValueError:
handle()
4. Чрезмерно вложенные list comprehensions
[x for x in lst if x > 0 if x < 100 if x % 2 == 0]
Читаемость? Нулевая.
✅ Явный цикл:
result = []
for x in lst:
if 0 < x < 100 and x % 2 == 0:
result.append(x)
5. Копирование ссылок на изменяемые объекты
data = [{}] * 3
data[0]["a"] = 1
print(data)
Ожидаешь три разных словаря? А получил три ссылки на один и тот же.
✅ Делай так:
data = [{} for _ in range(3)]
🗣️ Запомни: даже если код "работает", это не значит, что он хорош. Следи за чистотой — антипаттерны незаметны, но со временем превращают проект в хаос.