🐍 Python  ·  20 вопросов  ·  ~55 мин  ·  ⏱ Таймер 55:00  ·  Сложный  · 

Декораторы и контекстные менеджеры

Разбирает обёртки функций, сохранение метаданных и гарантированное освобождение ресурсов. Вопросы требуют проследить выполнение, сравнить близкие варианты и заметить условие, которое меняет результат в блоках «Функции-объекты», «Декораторы», «Контекстный блок with» и «Собственные менеджеры». Все задания рассчитаны на CPython 3.12; отличия других реализаций или версий учитываются только там, где это прямо оговорено.

Отвечено: 0 из 20
⏱ --:--
0%
💡 Инструкция: Версия: CPython 3.12. Выберите один ответ из четырёх. На 20 вопросов отведено не меньше 40 минут; код лучше читать построчно. После завершения вы увидите общий процент, четыре тематические шкалы и объяснение каждого ответа.
Вопрос 1 из 20
В каком порядке применяются декораторы?
Python
def a(fn):
    print("a create")
    return fn
def b(fn):
    print("b create")
    return fn
@a
@b
def f(): pass
Вопрос 2 из 20
Зачем functools.wraps?
Вопрос 3 из 20
Проследите вход в `with`, тело блока и выход. В каком порядке появятся три строки?
Python
class C:
    def __enter__(self): print("enter"); return 7
    def __exit__(self,*args): print("exit")
with C() as x:
    print(x)
Вопрос 4 из 20
Когда __exit__ должен возвращать True?
Вопрос 5 из 20
Что выведет декоратор с состоянием?
Python
def count(fn):
    n=0
    def w():
        nonlocal n
        n+=1
        return n, fn()
    return w
@count
def f(): return "ok"
print(f(), f())
Вопрос 6 из 20
Какой порядок вызова обёрток?
Python
def tag(name):
    def d(fn):
        def w(): return name+fn()+name
        return w
    return d
@tag("A")
@tag("B")
def f(): return "X"
print(f())
Вопрос 7 из 20
Как передать декоратору параметр?
Вопрос 8 из 20
Проследите генераторный менеджер контекста. В каком порядке появятся `open`, значение тела и `close`?
Python
from contextlib import contextmanager
@contextmanager
def cm():
    print("open")
    try:
        yield 3
    finally:
        print("close")
with cm() as x: print(x)
Вопрос 9 из 20
В оболочке декоратора допущена ошибка: она принимает только одну узкую сигнатуру. Какое исправление позволит передавать обычные позиционные и именованные аргументы?
Вопрос 10 из 20
Что произойдёт с исключением в contextmanager?
Python
from contextlib import contextmanager
@contextmanager
def cm():
    try:
        yield
    except ValueError:
        print("handled")
with cm():
    raise ValueError()
Вопрос 11 из 20
Как написать декоратор для async-функции без потери ожидания?
Вопрос 12 из 20
Как ExitStack освободит заранее неизвестное число ресурсов?
Вопрос 13 из 20
Что выведет декоратор класса-функции?
Python
def deco(cls):
    cls.kind="marked"
    return cls
@deco
class A: pass
print(A.kind)
Вопрос 14 из 20
Логирующий декоратор печатает все аргументы целиком. Какая ошибка безопасности заложена в таком решении?
Вопрос 15 из 20
Что вернёт cached_property?
Python
from functools import cached_property
class A:
    def __init__(self): self.calls=0
    @cached_property
    def value(self): self.calls+=1; return 5
a=A(); print(a.value,a.value,a.calls)
Вопрос 16 из 20
Два менеджера контекста вложены друг в друга. Каков точный порядок входов, тела и выходов?
Python
class C:
    def __init__(self,n): self.n=n
    def __enter__(self): print("in",self.n); return self
    def __exit__(self,*a): print("out",self.n)
with C(1), C(2): print("body")
Вопрос 17 из 20
Нужно временно изменить текущий каталог или настройку, а затем гарантированно вернуть прежнее значение. Какое проектное решение выбрать?
Вопрос 18 из 20
Генератор с `@contextmanager` выполняет второй `yield` при выходе. Чем закончится этот граничный сценарий?
Вопрос 19 из 20
Как тестировать декорированную функцию отдельно от обёртки при использовании wraps?
Вопрос 20 из 20
Какой результат у nullcontext?
Python
from contextlib import nullcontext
with nullcontext(5) as x:
    print(x)

Ответьте на все 20 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу