Разберите механизм: почему рекурсивная функция после декорирования обычно проходит через обёртку на каждом рекурсивном вызове?
База Hintsage
Функции и декораторы
Замыкания, decorators, callable-объекты и управление контекстом.
Практика
Вопросы: Функции и декораторы
Что изменится, если декоратор применить к classmethod снаружи, а не к исходной функции внутри?
Как изменится поведение async-функции, если её обернуть обычным синхронным декоратором?
Если функция-обёртка декоратора содержит yield, что фактически произойдёт при вызове декорированной функции?
В следующем контекстном менеджере ошибка возникает и в теле блока, и при выходе. Какое исключение в итоге покинет with?
class Resource:
def __enter__(self):
return self
def __exit__(self, exc_type, exc, tb):
if exc_type is not None:
raise ValueError("cleanup failed")
return False
with Resource():
raise KeyError("body failed")
К чему приведёт объявление фабрики декоратора как async-функции вместо обычной функции?
Какую роль играет метод _recreate_cm в ContextDecorator при повторных вызовах декорированной функции?
Когда для частичного связывания аргументов предпочтительнее использовать functools.partial, а не замыкание?
Разберите, почему обычный контекстный менеджер нельзя напрямую использовать в асинхронном блоке.
Найдите причину вывода класс вместо экземпляр при входе в контекст:
class Resource:
def __enter__(self):
print("класс")
return self
def __exit__(self, exc_type, exc, tb):
return False
r = Resource()
r.__enter__ = lambda: print("экземпляр")
with r:
pass
Разберите последствие: что станет с именем функции, если декоратор вернёт невызываемый объект?
Когда для управления ресурсами нужен ExitStack вместо обычного with?
Сравните два способа декорирования свойства: какой вариант завершится ошибкой при обращении к User().name и почему?
def audit(fn):
def wrapper(*args):
print("audit")
return fn(*args)
return wrapper
class User:
@audit
@property
def name(self):
return "Ada"
print(User().name)
В блоке with контекстный менеджер возвращает из enter не себя: что получит переменная после as?
Для обработчика, который передаётся в multiprocessing, почему замыкание может оказаться непригодным, тогда как экземпляр вызываемого класса часто подходит?
Зачем декоратору с параметрами нужен дополнительный уровень вызова?
Разберите ситуацию: какие методы контекстных менеджеров будут вызваны, если второй менеджер не смог войти в составной блок with?
class M:
def __init__(self, name, fail=False):
self.name, self.fail = name, fail
def __enter__(self):
print("enter", self.name)
if self.fail:
raise RuntimeError(self.name)
return self
def __exit__(self, *exc):
print("exit", self.name)
return False
with M("A") as a, M("B", True) as b:
print("body")
Объясните механизм: как замыкание сохраняет изменяемое состояние между вызовами внутренней функции через nonlocal?
Что произойдёт при вызове экземпляра, если __call__ задан только как атрибут этого экземпляра, но не определён в его классе?
Объясните, как генераторный контекстный менеджер обрабатывает исключение, возникшее внутри блока with.
Показано 21–40 из 50