Esta será a primeira postagem de uma série que visa apresentar as principais funcionalidades da estruturação de um programa em Python, o módulo. O módulo pode ser entendido como o nível mais alto dos programas em Python, onde as instruções são fornecidas para tratamento de qualquer problema.
A principal empregabilidade de módulo é no empacotamento de componentes de um sistema. Pode-se citar como suas principais funcionalidades: reutilização de código, particionamento do espaço de memória e dados compartilhados.
Arquitetura de um programa em Python
Normalmente, tem-se mais de um arquivo em um programa em Python, mesmo que, se tenha apenas um arquivo, geralmente, estará sendo utilizado módulos de terceiros e/ou internos do sistema.
Basicamente, um programa em Python consiste em um arquivo de nível superior que contém o fluxo inicial do programa e uma série de módulos que são importados pelo arquivo de nível superior e por outros módulos.
Abaixo será mostrado um esquema com 3 arquivos de módulo: a.py, b.py e c.py. Por notação o arquivo a.py será o usado como nível superior e os demais como módulos. Imagine que no arquivo b.py tenha a seguinte instruções:
A principal empregabilidade de módulo é no empacotamento de componentes de um sistema. Pode-se citar como suas principais funcionalidades: reutilização de código, particionamento do espaço de memória e dados compartilhados.
Arquitetura de um programa em Python
Normalmente, tem-se mais de um arquivo em um programa em Python, mesmo que, se tenha apenas um arquivo, geralmente, estará sendo utilizado módulos de terceiros e/ou internos do sistema.
Basicamente, um programa em Python consiste em um arquivo de nível superior que contém o fluxo inicial do programa e uma série de módulos que são importados pelo arquivo de nível superior e por outros módulos.
Abaixo será mostrado um esquema com 3 arquivos de módulo: a.py, b.py e c.py. Por notação o arquivo a.py será o usado como nível superior e os demais como módulos. Imagine que no arquivo b.py tenha a seguinte instruções:
def module_b(parameter): print "The value in parameter received is: %s." % parameter if(__name__ == "__main__"): module_b("This is a teste: level higher!!!")
Na primeira linha tem-se a definição de uma função que recebe como parâmetro um valor qualquer para ser impresso pela mesma, logo depois(linha 3), uma instrução print para apresentar o valor recebido pelo parâmetro. As linhas 5 e 7 é um tratamento especial que existe na linguagem será abordado em postagens posteriores.
Agora será definido no arquivo a.py uma importação do módulo b.py e uma chamada a função module_b. Ambos nas linhas 1 e 3, respectivamente.
Agora será definido no arquivo a.py uma importação do módulo b.py e uma chamada a função module_b. Ambos nas linhas 1 e 3, respectivamente.
import b b.module_b("Module a.py")
Note que para utilização da função module_b torna-se necessário o uso da importação do módulo b.py, sem esta claúsula não é possível acessar nenhum componente presente neste arquivo. Feito a importação utiliza-se a notação objeto.atributo que é vista em todos os códigos em Python. A instrução import será mostrada com mais detalhes posteriormente. Na figura 1, o esquema é apresentado graficamente.
Está presente na figura 1 uma parte referente aos módulos internos do sistema. Existem mais de 200 módulos para diversas funcionalidades em Python, para maiores informações acesse: http://www.python.org.
Funcionamento das importações
Quando algum módulo é importado são realizadas três etapas em tempo de execução:
Como deve ter sido observado na linha 1 do arquivo a.py, a extensão do arquivo de módulo importado .py é omitida e também seu caminho. Isto é feito de forma proposital para manter a portabilidade entre plataformas. O caminho de pesquisa em Python segue a seguinte hierarquia:
Este é um arquivo chamado myconfig.pth, e serve como exemplo:
Referência
Está presente na figura 1 uma parte referente aos módulos internos do sistema. Existem mais de 200 módulos para diversas funcionalidades em Python, para maiores informações acesse: http://www.python.org.
Funcionamento das importações
Quando algum módulo é importado são realizadas três etapas em tempo de execução:
- Localizar arquivo de módulo
- Compilá-lo em código de byte(se necessário)
- Executar o código afim de construir o objeto que ele define
Como deve ter sido observado na linha 1 do arquivo a.py, a extensão do arquivo de módulo importado .py é omitida e também seu caminho. Isto é feito de forma proposital para manter a portabilidade entre plataformas. O caminho de pesquisa em Python segue a seguinte hierarquia:
- Diretório base do arquivo de nível superior
- Diretórios do PYTHONPATH
- Diretórios da biblioteca padrão
- Todo conteúdo dos arquivos .pth(quando presentes)
- Diretório base de nível superior: são todos os arquivos de módulos presentes no diretório onde está o arquivo de nível superior.
- PYTHONPATH: variável de ambiente onde o Python busca os módulos a serem carregados, para maiores detalhes, clique aqui.
- Diretório a biblioteca padrão: localização dos módulos padrões do Python.
- Arquivos .pth: Este é um recurso avançado da linguagem. Pode-se ter um ou mais arquivos .pth com informações sobre localizações do módulos. Este recurso pode ser utilizado no lugar do PYTHONPATH, que como descrito no link acima, não deve ser alterado sem plena certeza. Neste arquivo tem-se uma lista de diretórios que contém arquivos de módulos necessários, e sempre, deve ser informado um caminho por linha.
/home/jmsandy/src/
/home/jmsandy/src/modules
Compilação
Uma vez encontrado o arquivo de módulo, o Python, compila o arquivo .py para um código de byte .pyc para maior desempenho na execução. Note que esta etapa pode ser pulada quando é encontrado um arquivo .pyc para o módulo requerido. Porém, mesmo quando este arquivo é encontrado pode ocorrer compilação para manter a sincronia entre o arquivo .py e o .pyc, o Python verifica se o arquivo .py foi atualizado e reverte suas atualizações para o arquivo .pyc.
Execução
Após gerado o código de byte é realizada a execução do mesmo. O interpretador faz uma varredura de todas as instruções contida no arquivo de módulo de baixo para cima carregando os atributos para a memória.
José Mauro da Silva Sandy
Uma vez encontrado o arquivo de módulo, o Python, compila o arquivo .py para um código de byte .pyc para maior desempenho na execução. Note que esta etapa pode ser pulada quando é encontrado um arquivo .pyc para o módulo requerido. Porém, mesmo quando este arquivo é encontrado pode ocorrer compilação para manter a sincronia entre o arquivo .py e o .pyc, o Python verifica se o arquivo .py foi atualizado e reverte suas atualizações para o arquivo .pyc.
Execução
Após gerado o código de byte é realizada a execução do mesmo. O interpretador faz uma varredura de todas as instruções contida no arquivo de módulo de baixo para cima carregando os atributos para a memória.
José Mauro da Silva Sandy
Referência
- MARK, Lutz. ASCHER, David. Aprendendo Python. Tradução João Tortello. 2. ed. Porto Alegre: Bookman, 2007.
- CEP - Código Endereçamento Postal - Descrição de como é formato o CEP no país e uma pequena implementação de busca.
- String em Python - Utilização de Strings em Python
2 comentários:
25 de dezembro de 2008 às 11:21
Hohoho!
Ótimo texto cara!
Só queria chamar a atenção para os códigos apresentados. A descrição deles, em linhas, não estão correspondendo à implementação. Dá uma checada nisso. Acho que você poderia pensar em três códigos, não muito extensos, mas de uso real, como eu fiz com o Clock e mostrar a implementação de todos, para facilitar mais ainda. Isso é idéia pra textos futuros! ;-)
Usou o Inkscape pra fazer a imagem? Tá melhorando graficamente, heim?!
Achei o texto fácil de entender e concordo com tudo! A utilização de módulos, ao meu ver, tem como maiores vantagens a reutilização e a organização do código. Em vez de termos 1 código com 1000 linhas, podemos ter 10 com 100 linhas. Isso facilita muito a depuração!
Sobre os arquivos .pth, eu conheci pelas nossas conversas, mas nunca vi a implementação de um. É fácil como tudo em Python, mas o desenvolvedor deve ter cuidado para não prejudicar a portabilidade do programa. Uma dúvida que surgiu foi se, neste arquivo, é possível utilizar variáveis de ambiente, como $HOME, o que possibilitaria indicar algo como $HOME/python/modules ou caminhos como ../../Python/Modules ou mesmo criar nossas variáveis, pois poderíamos atribuir um caminho a uma variável e indicar caminhos relativos àquela variável no restante do arquivo. Isso estenderia o uso deste recurso de Python!
[]!
25 de dezembro de 2008 às 14:33
Fala brow!!!
Kra, realmente eu ia colocar um exemplo mais real, porém, a termo de conceituação preferi esse mais abstrado.
As linhas mano já concertei na postagem, valeu.
Fiz no Inkscape sim, fazer retangulos é mole, mas quem sabe um dia chego lá. Com certeza não é meu forte.
Agora vamos a sua resposta.
Primeiramente queria acrescentar que para os arquivos .pth funcionarem, eles devem estar no diretorio do Python, e.g., /usr/local/lib/python2.5/site-packages/.
Pelo que eu pude observer e testar é necessário informar o caminho completo, e também, não funciona variaveis de ambiente.
Abraço brow.
Postar um comentário