Перейти до основного вмісту
🔒 Режим прев'ю. Перші 15 уроків Foundations — безкоштовні; цей — Pro. Запусти 7-денний trial щоб відкрити редактор, AI-підказки і решту курсу. Потрібна картка, скасування в Dashboard у будь-який момент.Почати 7-денний trial →
← КурсиSenior Deep-DivesModule 11 · Decorator patterns at scaletyping.ParamSpec — decorators that preserve the wrapped signaturepredict156 / 161
+150 XP
Завдання
📝 **Завдання:** Спрогнозуйте 7-рядковий вихід. Декоратор `trace` обгортає дві функції: `add(a, b)` і `greet(name, *, prefix='Hi')`. Під час виконання обгортка друкує «виклик ...» під час входу та «повернуто ...» під час виходу. Останній рядок використовує `inspect.signature(add)`, щоб перевірити, що `@wraps` зберіг ОРИГІНАЛЬНИЙ підпис — доводячи, що оголошення `ParamSpec` на стороні введення відображає те, що вже бачить інтроспекція під час виконання. 📋 Реалізуйте наведену вище функцію. Тести запускаються автоматично. 💡 **Підказка:** Перечитайте теорію, якщо ви застрягли.
Передбач вивід

Прочитай код уважно

from typing import Callable, ParamSpec, TypeVar
from functools import wraps
import inspect


P = ParamSpec("P")
R = TypeVar("R")


def trace(fn: Callable[P, R]) -> Callable[P, R]:
    @wraps(fn)
    def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
        print(f"calling {fn.__name__}")
        result = fn(*args, **kwargs)
        print(f"returned {result!r}")
        return result
    return wrapper


@trace
def add(a: int, b: int) -> int:
    return a + b


@trace
def greet(name: str, *, prefix: str = "Hi") -> str:
    return f"{prefix}, {name}"


result = add(2, 3)
print(f"=> {result}")

result = greet("Ada", prefix="Hello")
print(f"=> {result}")

sig = inspect.signature(add)
print(f"add sig: {sig}")

Що виведе програма? Напиши тут:

💬 Обговорення

Будьте першим — поставте запитання або поділіться порадою.
Увійдіть щоб приєднатися до обговорення. Читання безкоштовне.
Завантаження обговорення…