15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

<function trace.<locals>.wrapper at 0x107f7ed08>

O motivo é óbvio. A função trace retorna a função wrapper que ela define dentro

de si. É wrapper o nome atribuído a fibonacci no módulo, por causa do

decorador. Esse comportamento é problemático porque atrapalha ferramentas

que fazem introspecção, como os depuradores (consulte o Item 57: “Prefira usar

depuradores interativos como o pdb”) e os serializadores de objetos (consulte o

Item 44: “Aumente a confiabilidade de pickle com copyreg”).

Por exemplo, a função nativa help torna-se inútil na função decorada fibonacci.

help(fibonacci)

>>>

Help on function wrapper in module __main__:

wrapper(*args, **kwargs)

A solução é usar a função auxiliar wraps no módulo nativo functools. Em

resumo, wraps é um decorador que ajuda a escrever decoradores. Aplicá-lo à

função wrapper copiará todos os metadados importantes da função interna para a

função externa.

def trace(func):

@wraps(func)

def wrapper(*args, **kwargs):

# ...

return wrapper

@trace

def fibonacci(n):

# ...

Se executarmos a função help agora, produziremos o resultado esperado, mesmo

que a função esteja decorada.

help(fibonacci)

>>>

Help on function fibonacci in module __main__:

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!