15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

def trace(func):

def wrapper(*args, **kwargs):

result = func(*args, **kwargs)

print('%s(%r, %r) -> %r' %

(func.__name__, args, kwargs, result))

return result

return wrapper

Para aplicá-lo a uma função, usamos o símbolo @.

@trace

def fibonacci(n):

"""Return the n-th Fibonacci number"""

if n in (0, 1):

return n

return (fibonacci(n - 2) + fibonacci(n - 1))

O símbolo @ é equivalente a chamar o decorador na função que ele envolve e

associar o valor de retorno ao nome original no mesmo escopo.

fibonacci = trace(fibonacci)

Chamar essa função decorada rodará o código envolvente (wrapper) antes e

depois da função fibonacci ser executada, mostrando no console os argumentos e

o valor de retorno a cada passo da tarefa recursiva.

fibonacci(3)

>>>

fibonacci((1,), {}) -> 1

fibonacci((0,), {}) -> 0

fibonacci((1,), {}) -> 1

fibonacci((2,), {}) -> 1

fibonacci((3,), {}) -> 2

Funciona bem, mas tem um efeito colateral indesejado. O valor devolvido pelo

decorador – a função que é chamada acima – não acredita que seu nome seja

fibonacci.

print(fibonacci)

>>>

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!