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.

acessá-los pelo seu nome único de nível mais alto.

Para o exemplo que acabamos de ver, poderíamos primeiramente fazer import

analysis.utils e import frontend.utils. Depois, poderíamos acessar as funções inspect

pelos seus caminhos completos: analysis.utils.inspect e frontend.utils.inspect.

Dessa maneira, evitamos ter de usar a cláusula as e deixamos o código

abundantemente claro, de forma que novos leitores não familiarizados com

ele saibam com toda a certeza o local em que as funções foram definidas.

APIs estáveis

O segundo uso dos pacotes no Python é criar APIs estáveis e rigorosas para

consumidores externos.

Quando uma API precisa atender a um público amplo (por exemplo, um pacote

de código aberto – consulte o Item 48: “Saiba onde encontrar os módulos

desenvolvidos pela comunidade”), é de suma importância oferecer

funcionalidade estável e que não mude de uma versão para outra. Esse tipo de

garantia implica, obrigatoriamente, esconder dos usuários externos a organização

interna do código, permitindo que possamos refatorar e aprimorar os módulos

internos do pacote sem que os programas que empregam nosso pacote deixem de

funcionar.

O Python pode limitar a superfície da API exposta aos consumidores usando o

atributo especial __all__ de um módulo ou pacote. O valor de __all__ é uma

lista de cada nome que o módulo exportará como parte de sua API pública.

Quando o código consumidor declara from foo import *, apenas os atributos em

foo.__all__ serão importados de foo. Se __all__ não estiver presente em foo,

todos os atributos públicos, ou seja, aqueles que não têm um underscore no

início do nome, são importados (consulte o Item 27: “Prefira atributos públicos

em vez de privativos”).

Por exemplo, digamos que se queira oferecer um pacote para calcular a

ocorrência de colisões entre projéteis. No exemplo a seguir, definimos que o

módulo models de nosso pacote mypackage conterá a representação dos

projéteis:

# models.py

__all__ = ['Projectile']

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!