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.

class Projectile(object):

def __init__(self, mass, velocity):

self.mass = mass

self.velocity = velocity

Também definimos um módulo utils em mypackage para fazer operações nas

instâncias de projéteis (classe Projectile), como simular colisões entre eles.

# utils.py

from . models import Projectile

__all__ = ['simulate_collision']

def _dot_product(a, b):

# ...

def simulate_collision(a, b):

# ...

Agora, gostaríamos de oferecer todas as partes públicas desta API como um

conjunto de atributos disponíveis no módulo mypackage. Isso permite que os

consumidores deste módulo em seus projetos (os chamados consumidores

downstream 3 ) sempre importem diretamente de mypackage em vez de ter que

importar de mypackage.models ou mypackage.utils. Com isso, o código

consumidor que acessa a API continuará a funcionar mesmo se a organização

interna de mypackage mudar (por exemplo, caso models.py seja deletado).

Para fazer isso nos pacotes do Python, é preciso modificar o arquivo __init__.py

na pasta mypackage. Esse arquivo, na realidade, torna-se o índice de conteúdo

do módulo mypackage quando importado. Assim, pode-se especificar uma API

explícita para mypackage simplesmente limitando o que é possível importar para

__init__.py. Uma vez que todos os módulos internos já especificam __all__,

podemos expor a interface pública de mypackage simplesmente importando tudo

o que estiver nos módulos internos e atualizando __all__ para refletir isso.

# __init__.py

__all__ = []

from . models import *

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!