Saltar para o conteúdo principal
🔒 Modo de pré-visualização. As primeiras quinze aulas de Foundations são grátis; esta é Pro. Inicie um trial de 7 dias para desbloquear o editor, as dicas AI e o resto do programa. Cartão necessário, cancele a qualquer momento no Dashboard.Iniciar trial de 7 dias →
← CursosSenior Deep-DivesModule 11 · Decorator patterns at scaletyping.ParamSpec — decorators that preserve the wrapped signaturepredict156 / 161
+150 XP
Tarefa
📝 **Tarefa:** Prever a saída de 7 linhas. Um decorador `trace` envolve duas funções: `add(a, b)` e `greet(name, *, prefix='Hi')`. Em tempo de execução, o wrapper imprime 'calling...' na entrada e 'returned...' na saída. A linha final usa `inspect.signature(add)` para verificar se `@wraps` preservou a assinatura ORIGINAL — provando que a declaração `ParamSpec` do lado da digitação reflete o que a introspecção de tempo de execução já vê. 📋 Implemente a função acima. Os testes são executados automaticamente. 💡 **Dica:** Releia a teoria se tiver dúvidas.
Prevê a saída

Lê o código com atenção

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}")

O que o programa vai imprimir? Escreve aqui:

💬 Discussão

Seja o primeiro a fazer uma pergunta ou compartilhar uma dica.
Faça login para entrar na discussão. A leitura é gratuita.
Carregando discussão…