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.

__all__ += models.__all__

from . utils import *

__all__ += utils.__all__

O exemplo a seguir mostra um consumidor da API que importa diretamente

mypackage em vez de acessar os módulos internos:

# api_consumer.py

from mypackage import *

a = Projectile(1.5, 3)

b = Projectile(4, 1.7)

after_a, after_b = simulate_collision(a, b)

Salta aos olhos o fato de que funções como mypackage.utils._dot_product não

estarão disponíveis ao consumidor da API de mypackage porque não estão

presentes em __all__. Não estar listado em __all__ significa que eles não serão

importados pelo comando from mypackage import *. Os nomes internos são,

efetivamente, ocultos.

A técnica funciona bem quando é importante oferecer uma API estável e

explícita. Entretanto, se estamos construindo uma API para uso interno de

nossos próprios módulos, a funcionalidade de __all__ é provavelmente

desnecessária e deve ser evitada. Os namespaces oferecidos pelos pacotes são

normalmente suficientes para uma equipe de programadores que trabalha com

grandes quantidades de código sob seu controle e, ao mesmo tempo, mantém

limites de interface razoáveis.

Cuidado com o import *

Importações do tipo from x import y são claras porque a fonte de y é,

explicitamente, o pacote ou módulo x. Importações com coringas como from

foo import * podem ser úteis, especialmente em sessões interativas do Python.

Entretanto, os coringas tornam o código mais difícil de entender.

• from foo import * esconde dos novos leitores do código a origem dos nomes. Se

um módulo tiver múltiplos import *, será preciso verificar todos os módulos

referenciados para descobrir onde determinado nome foi definido.

• Os nomes vindos de import * substituirão quaisquer nomes conflitantes

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!