Detalhes sobre a criação de Módulos em Python

Introdução

A príncipio foram omitidos alguns detalhes sobre a utilização de módulos em Python. Esta última postagem sobre a série Módulos em Python irá cubrir tais detalhes.

Ocultação de dados

Os módulos em Python exportam todas suas declarações de nível superior. Porém, existe a possibilidade de ocultar algumas exportações quando usa-se a claúsula from *. Vale ressaltar que isto não é um encapsulamento e as notações a seguir são contornadas utilizando as demais instruções, import e from.

Pode-se utilizar a notação _VARIAVEL ou a lista __all__ para definir quais serão os nomes exportados. Uma é exatamente o inversa da outra, na primeira situação é definido quais variáveis, funções, etc., que não serão exportadas, já na segunda, é definida uma lista no início do arquivo de módulo com todos os nomes de nível superior para exportação.

Na postagem, Importação de Módulos em Python, foi apresentado o arquivo de módulo employee.py. Para exemplificar a conceituação acima citada será utilizado tal arquivo.

_VARIAVEL

def salary_inc(perc=0, salary=0):
   return (salary + ((salary / 100) * perc))

def _sum_emp(list_emp=[]):
   return len(list_emp)
__all__
__all__=["salary_inc", "sum_emp"]

def salary_inc(perc=0, salary=0):
   return (salary + ((salary / 100) * perc))

def sum_emp(list_emp=[]):
   return len(list_emp)
Utilizando: __main__ e __name__

Uma das grande vantagens de Python é que o mesmo possibilita utilizar um arquivo de módulo tanto como um arquivo de nível superior(executável) ou como um arquivo de módulo propriamente dito, ao contrário de outras linguagens, e.g., C e Pascal.

Para isso, cada módulo tem um atributo interno chamado __name__, que de acordo com a utilização do arquivo, o interpretador atribui seu valor. Quando utilizado como arquivo de nível superior, __name__ recebe a string "__main__" e caso contrário recebe o nome do módulo importado.

Claúsula as

Como visto na postagem, Pacotes de Módulos em Python, pode-se ter caminho grandes a serem percorridos até chegar ao objetivo final. Para facilitar este percurso existe a claúsula as. Esta serve como uma alias de todo o caminho, conforme segue:
import diretorio1.diretorio2.employee as employee
Dessa maneira, todo caminho pode ser omitido e a utilização fica da forma mais simples. É claro que pode-se atribuir o objeto retornado a uma nova variável, de fato é isso que acontece com a claúsula as.

Abaixo segue uma conceituação sobre o ambiente de módulos em Python.

Figura 1. Ambiente de Módulos


José Mauro da Silva Sandy


Referências

  • MARK, Lutz. ASCHER, David. Aprendendo Python. Tradução João Tortello. 2. ed. Porto Alegre : Bookman, 2007.
Série Módulos em Python
Leia Também

2 comentários:

  Lopes

2 de janeiro de 2009 às 11:22

Salve!
Começando o ano bem! Postagem legal e PageRank 3! ;-)
Gostei do texto. Achei bastante claro!
* No primeiro exemplo que você dá, mostrando o underscore e o __all__, creio que seria interessante fazer as 2 formas equivalentes. Quero dizer: no primeiro, você importa somente a primeira função. Seria interessante importar apenas ela no __all__ também.
* No __name__ e __main__, acho que ficou bem explicado. Só faltou explicar como isso é usado no código Python e dar um exemplo. Acho que isso ajuda o leitor a ligar uma coisa com a outra.
* A última figura não ficou muito clara pra mim. Pelo que entendi, há um módulo feito por você, onde é detalhada cada parte do mesmo. Então há um import para outro módulo, na linha inteira. Este módulo se comunica com outro via import. É isso? O que significam as linhas tracejadas? Por que uma sobe além da imagem? É só pra mostrar que há algo acima?
Abraço, bro!

  José Mauro

2 de janeiro de 2009 às 14:02

Fala brow!!

O seu PageRank tá desatualizado hein, agora está como 5.

Você tem razão quanto as suas observações. Na primeira sinceramente não tinha pensado nisso. Na segunda acredito que expliquei direitim mais um exemplo fixaria melhor a idéia.

Agora a figura é como o Python se comporta. Dentro de um módulo pode-se se ter todas as estruturas apresentadas e um arquivo de módulo pode chamar um outro e receber chamada como apresentado. As setas ficam mais a título de expansão.

Á noite de respondo com detalhes mais técnicos é que agora abafo que estamos trocando o TC-DATA Turbo da loja para mudar de endereço.

PS. Minha ultima ação.

Abraço.