---
title: '7 Python Features That Make Your Code Worse'
source: 'https://youtube.com/watch?v=RHCyTWaRZSk'
video_id: 'RHCyTWaRZSk'
date: 2026-10-16
duration_sec: 927
channel: 'ArjanCodes'
---

# 7 Python Features That Make Your Code Worse

> Source: [7 Python Features That Make Your Code Worse](https://youtube.com/watch?v=RHCyTWaRZSk)

## Summary

This video discusses seven Python features that, while powerful, can lead to poor code quality when misused. The speaker, Aron, provides practical advice on when to avoid these features and offers alternative approaches to write cleaner, more maintainable code.

### Key Points

- **Properties for Expensive Operations** [00:01] — Using properties for attributes that perform complex operations (e.g., remote calls, database queries) hides the cost and can surprise developers. Instead, use explicit methods to make the operation clear.
- **Data Classes for Domain Objects** [01:52] — Data classes are great for simple data structures but lack business logic validation. Using them for domain objects without constraints can lead to invalid states (e.g., negative discounts). Prefer regular classes with methods for domain logic.
- **Pattern Matching Overuse** [04:22] — Pattern matching is powerful but can be overused. For simple checks (e.g., is user admin?), a simple if statement is clearer. Reserve pattern matching for complex, multi-condition structures.
- **Caching Without TTL** [05:23] — Using functools.cache without a time-to-live (TTL) can serve stale data (e.g., exchange rates). Use a TTL-based cache to ensure data freshness and avoid outdated information.
- **Decorator Stacking** [06:52] — Stacking many decorators on a function hides the execution order and makes code hard to understand. It can lead to unexpected behavior and security issues. Prefer explicit function calls or a single, well-documented decorator.
- **Async Contamination** [08:57] — Async/await can spread through the codebase, making business logic async even when not needed. Use blocking adapters or pass data as arguments to keep business logic synchronous and decoupled from infrastructure.
- **Slots for Dynamic Classes** [12:44] — Using __slots__ prevents dynamic attribute assignment, which can break flexible code. Only use slots for classes with a fixed set of attributes and where memory optimization is critical.

### Conclusion

The video emphasizes that while Python features are powerful, they should be used judiciously. Understanding the trade-offs and applying them only where appropriate leads to more maintainable and robust code.

## Transcript

эта строка? Имею в виду, это выглядит как атрибута, но это может быть свойство, что вызовов API. Технически ничего плохого
обращении к свойства, но определенные ожидания. Сегодня я покажу семь постоянно пользуюсь, но точно не
компромиссы для каждой из них. Итак, Свойство отлично подходит для вычисляемых атрибутов. Например,
определить полное имя человека на основе его можете легко сделать нечто подобное в чтение свойства делает намного
выполняет удаленный вызов, это скрывает выглядит как простое поле. Как в той строке Если у вас есть свойство, что
но на самом деле она устанавливает соединение налоговые ставки, проверяет валидность исчисляет сумму. Что ж, это не очень разумно. Это
обращаетесь к свойства, вы ждать неприятный сюрприз. Вместо этого гораздо лучше превратить ее в
даже можете добавить ключевое слово get действительно что-то получает. сделать его асинхронным, чтобы еще
Итак, вывод: используйте поведения, похожего на атрибуты. Если вы выполняете любые сложные операции,
методом. Кстати, именно эту разницу между программное обеспечение я Мастерство проектирование ПО». Эта
системного дизайна и архитектурных большим количеством практических примеров этих дизайнерских решениях самостоятельно,
aron.codes/mastery. Ссылки также есть в описании. Второй data classes), и я сам грешил этим. Имею в с устранением шаблонный код. Они
экземпляров и их вывод, а еще мне можно просто посмотреть на данные содержатся в объекте. Но каждое
поскольку дата-класс предназначен для простых структур данных. Итак, есть такой дата-класс корзины покупок, что
то проблема в том, что если я создам один из установить скидку, ну , не знаю, 200% или что-то никакого смысла с точки вид бизнеса. И в
здесь нет никаких гарантий, ограничений или открывает доступ к каждого поля, что объект имеет отвечать за
соблюдение. покупок, который не есть дата-классом, это обычный старый класс Python. Он имеет
тот дата-класс, что был раньше, но теперь он добавление товара, и он прибавит товар положительная, или для применение скидки.
применить скидку только в пределах от нуля использовано свойство (property), а суммы товаров. И это все данные, которые мы уже имеем
простое вычисление. миллионы товаров. Дата-классы все еще конфигурации, события, объекты значений, но
каждый доменный объект на дата-класс. Должен злоупотреблять дата- классами, особенно в поступайте так, как я говорю, а не так, как я поступаю.
образцом (pattern matching). Это очень крутая функция проверить структуру . Например, в этом можем применить сопоставление с
есть пользователь администратором, или или любой комбинацией таких на основе этого. Мать такие функции в своем
ими также легко злоупотребить, если не Поскольку в этом случае, вместо того образцом, мы можем просто проверить
admin, и это все, что нам нужно. В этом которую мы имеем здесь, гораздо понятнее у нас есть сейчас.
станет сложнее, будет комбинацией этих или будет привлекать другие вещи в будущем. причиной сделать нечто подобное. Однако,
простое решение, оно часто понятнее. кэширование, и в Python это выглядит невероятно декоратор cache, который можно импортировать из
функцией, и она кэшируется. Это действительно functools работает очень хорошо, результат кэша он подходит не для всех случаев.
обмена валют, но если курс изменится, старое кэшированное значение. Это значит, несоответствия, устаревшие данные и все
приносят кэши. Вы можете сделать это определив время жизни и ограничение кэша. И какой я здесь использую, под
работает очень хорошо. Вы можете определить этот указать максимальный размер, значение TTL, должно хранить это значение. А потом вы
декоратор почти да само, как functools cache, но cache. И теперь ваш курс обмена валют имеет значительно облегчает
нужно их обновлять. В общем, в своих скриптах, потому что это может четко понимать ограничение кэша, который
Итак, Python действительно отличный механизм сделать сквозную функциональность, как- лаконичным. Вы можете просто добавить
волноваться. Проблема в том, что есть куча разных декораторов, которые вы как в нашем случае
create account здесь имеет четыре связаны с ею декораторы. Здесь есть аудит, повторные нужны разрешения, и так далее. Результат
происходит при вызова этой функции, информации, но я не понимаю, что именно декораторы. Кроме того , теперь вы должны
эти декораторы. В каком порядке они можно понять, только если знать, что сущности, обертка функции. Итак, у нас есть
разрешения вызывает создание, потому что это декоратор. Транзакционный транзакционный, а аудит – повтор. Таким
это правильный порядок? Возможно, , не правда ли? Или когда мы хотим, чтобы запускаем функцию создание учетного
длинный список декораторов, как здесь. И опасными, потому что мы не хотим случайно учетных записей.
, которые сейчас как скрыты за структурами декораторов. Так что я
сквозного поведения , но не скрывайте опрятного вида тела функции, потому что это на самом деле происходит.
происходит. -это async. Async – очень хорошая функция. Она выводу параллельно, что сделает ваше приложение
более чувствительными. Проблема в том, что свойство распространяться, если вы есть асинхронный API- вызов, то функция, что
становится асинхронной, и неслышите, как все у вашему скрипту станет async. И это проблема. В держать бизнес- логику как можно дальше
вопрос, а не вопрос бизнес логики. бизнес логики. решение имеет приниматься на основе
этого профиля. А еще в меня есть политика собственно, и есть бизнес- логикой, что на основе каким будет результат.
провайдера кредитных профилей. Итак, кредитных профилей асинхронный, или если становится асинхронным, и тогда наша бизнес-
логика тоже становится асинхронной. Итак, вы асинхронный кредитный API с можете создать блокирующий адаптер,
синхронным вызовом метода И именно это мы меня есть get profile, но он использует asyncio.run профиля. А потом в главной функции я
политику оформления заказ. Таким оставаться синхронной, что хорошо. используется asyncio.run, поэтому если вы
цикле событий, это не будет работать. Тем не менее, применить во время редизайн – это ) и просто превратить это в
бизнес-логики. заказ получало не только кредитный профиль.
больше не нужно это делать. А потом вы главную функцию асинхронной. Это нужно вызвать ее с помощью async.run.
используем этот блокирующий провайдер, заказ. класса и сделав функцию оформления
ожидает заказа и профиль. я могу функцию оформления заказ. Тогда главная функция – это создать провайдер
получить профиль здесь.
могу передать профиль сюда. И, нужна эта блокирующая обертка провайдера профиля. Следовательно, это еще один способ сохранить
, но я использую ее на уровне периферии функции – я не полагаюсь на просто передаю данные. В общем, держите
используйте обертку, чтобы не вашей логике, или получайте данные по аргументы. Таким образом ваша бизнес-
инфраструктуры Последняя вещь, которую я также связана с дата-классами – это функция slots. Это то, что оптимизирует дата-классы,
и это приятно. значениями X и Y, вы можете установить slots объектную модель, которую использует Python.
Например, вы больше не сможете сделать то Python – назначить атрибут постфактума. добавить к ней метку, вы не сможете этого
сделать. Это приведет к ошибке. Это вы модель меняется, поэтому у вас больше какой можно редактировать. И хотя это
обычных дата- классов и классов Как, которая является простым дата- классом без Вы также можете увидеть это, когда я
говорю, что вы не должны использовать slots. память для многих небольших статических включать для каждого класса, поскольку это
разработчиков, которые используют ваш такое дополнительное ускорение даже использую slots только
разных объектов. Я знаю, что не буду атрибуты. И если я использую их в применял их там, где есть доступ в
посторонних систем. При этом, я считаю, что в если вы динамично назначаете атрибуты обычно избегал этого у своих
что это означает потерю значительной части Это означает, что если у вас есть гибкая точка, вы какие данные будут ее частью. Поэтому я
если вам нравится таков контент о Python на канал. Это помогает мне бы хотел услышать вашу мнение. Какие функции
используют чрезмерно или некоторыми пунктами, которые я сегодня добавил к Вот видео, которое, на мнение YouTube, вам
встречи следующего see you next time.
