👩💻 Динамическое создание классов — метапрограммирование в чистом виде В Python классы — это тоже объекты, и их можно создавать "на лету" с помощью функции type(). Это открывает путь к динамическому API, автоматическим моделям и DSL. ➡️ Пример: def make_model(name, **fields): return type(name, (object,), fields) User = make_model("User", name="Анна", age=25) print(User.name) # Анна admin = User() admin.role = "admin" print(admin.role) # admin 📌 Здесь type() создаёт новый класс User прямо во в...
🐍 Укус питона 🐍
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки. 👽 Админ - @tg_adminisrator 🔊 Купить рекламу: https://telega.in/c/byteofpython 👉 Чат: @abyteofpython 👉 Поделиться с друзьями: @byteofpython
Графики
📊 Средний охват постов
📉 ERR % по дням
📋 Публикации по дням
📎 Типы контента
Лучшие публикации
20 из 20Массивы в pattern matching. В качестве шаблонов также могут выступать массивы. Подобным шаблоны также могут содержать либо конкретные значения, либо переменные, которые передаются элементы массивов, либо символ прочерка _, если элемент массива не важен. В данном случае функция print_people принимает массив, который, как предполагается, состоит из трех элементов, рассмотрим их в следующей части. 🐍 Укус питона // 💬 Чат // #теория #pattern_matching #массивы
Что выведет код? x = 0 def outer(): x = 1 def inner(): nonlocal x x += 1 return x print("A", inner(), x) x = 5 print("B", inner(), x) outer() print("G", x)
👩💻 Контракты через аннотации — не просто подсказки типов Аннотации типов (type hints) — это не только помощь IDE. С их помощью можно внедрять контроль логики исполнения — проверять типы, значения и инварианты прямо во время работы программы. ➡️ Пример: from typing import get_type_hints def enforce_types(func): hints = get_type_hints(func) def wrapper(*args, **kwargs): for name, arg in zip(hints, args): if not isinstance(arg, hints[name]): raise TypeError(f"{name} должен быть {hints[name].name...
👩💻 Мемоизация — ускорение функций без переписывания логики Мемоизация — это техника кэширования результатов функций. Если функция вызывается с теми же аргументами, результат возвращается из памяти, а не вычисляется заново ➡️ Пример: from functools import lru_cache @lru_cache(maxsize=None) def fib(n): if n < 2: return n return fib(n-1) + fib(n-2) print(fib(35)) # быстро! 📌 Здесь @lru_cache запоминает все вызовы fib(). Без него вычисление числа Фибоначчи 35 заняло бы секунды, а с ним — доли ми...
Что выведет код? class A: def eq(self, o): return isinstance(o, A) class B: def eq(self, o): return isinstance(o, B) hash = object.hash s = set() try: s.add(A()) except TypeError: print("A") b = B() s.add(b) print("B", b in s)