Import em Python ao infinito e além

From medium import article

Justin Tran

Neste artigo vou falar sobre a importação de módulos em Python, não estarei entrando em detalhes do funcionamento de módulos ou da importação de pacotes e do funcionamento de sua estrutura hierárquica, porém o mesmo está ligado inerentemente ao import e por conseguinte tem de ser mencionado, let’s go.

Em Python todo arquivo .py é um modulo, e um modulo consiste de classes, funções, variáveis dentre outros itens da linguagem que nesse contexto de modulo tem por objetivo obter uma melhor organização do código, fácil manutenibilidade e reutilização.

Além do trivial dito a pouco, existe o pacote que é um conjunto de módulos e também um tipo de modulo que é um conjunto de pacotes, sim, sem conceitos bem fundamentados os módulos & pacotes podem se apresentar de forma complexa a primeira vista. — Pacotes são criados utilizando a notação dotted names, caso tenha interesse pesquise sobre.

Para realizar o download de módulos / pacotes em Python 3 utilizamos o Pip 3 ( Python Package Index ) com a seguinte sintaxe : pip3 install pacote, já em Python 2 utilizamos apenas o Pip com a seguinte sintaxe : pip install pacote.
— Para instalar o Pip em si, você pode acessar o guia de instalação clicando aqui. Veja o rank dos módulos / pacotes mais instalados : Py Pi Rank.

Os módulos podem ser utilizados tanto no modo interativo quanto em scripts Python, para fazer a utilização de tais módulos precisamos importa-los e para isso utilizamos as seguintes formas :

1 º : import module

Quando executamos tal diretiva o que acontece é que o nome do modulo é adicionado a tabela de símbolos do programa, essa tabela de símbolos pode ser vista por dois métodos principais : globals () e locals (), sendo que globals retorna o dicionário do namespace do módulo enquanto locals retorna o dicionário do namespace atual, além de visualizar é possível adicionar itens em tempo de execução ou codificação com a seguinte sintaxe : locals () [ ‘Say’ ] = ‘Hello, World !’, nesse caso estamos adicionando e criando uma variável chamada Say do tipo string ao nosso programa, em suma a tabela de símbolos é uma lista dos itens disponíveis para utilizarmos em nosso programa.

Para utilizar os itens de um módulo precisamos buscar pelos mesmo pois quando importamos desta forma apenas o namespace do módulo como um todo é adicionado a tabela de símbolos, então precisamos entrar no mesmo para fazer uma busca de qualquer que seja o item desejado, para isso nós utilizamos o operador de ponto ‘ . ’, ele percorre todos os símbolos dentro de um modulo até encontrar ou levantar uma mensagem de erro e sair da pesquisa, sendo encontrado é possível utilizar o item normalmente, a sintaxe final fica desta maneira :

[ Nome Do Modulo ] [ Operador De Ponto ] [ Item Que Desejamos ] — Math.pi
Ao utilizar algum método ou buscar por algum atributo estamos adicionando o mesmo ao escopo local !
2 º : from module import function

Com essa segunda forma de importação nós melhoramos o desempenho de nossa aplicação pois do modulo em questão estamos importando apenas oque vamos utilizar, enquanto no método anterior importamos o modulo inteiro mesmo que não utilizemos 90 % dos itens contidos no mesmo, apesar de importamos apenas o que precisamos isso pode causar certos problemas dependendo do tamanho do projeto pois ao importar com essa segunda opção podemos criar conflito de nomes com itens já existentes em nosso programa ou de outros módulos dependendo da importação realizada.

Caso ocorra conflito de nomes nós podemos dar um apelido para o item que está sendo importado com a seguinte sintaxe : from module import function as funct, caso seja mais de um item : from module import f1 as fun1, f2 as fun2, e ainda que não queira usar alguma das duas opções anteriores você pode atribuir o item a uma variável como mostrado aqui : import module; root = module.function.

3 º : from module import *

A terceira forma nunca deve ser utilizada pois assim como na importação anterior o conflito de nomes aqui se da em grande escala, enquanto estávamos importando apenas itens específicos aqui estamos importando tudo do modulo / pacote e adicionando a tabela de símbolos, ou seja, não teremos somente o possível conflito de nomes mas também problemas no desempenho já que toda vez que o operador de ponto for utilizado ele vai percorrer todos esses símbolos ( Dependendo do escopo é claro ) até encontrar o que estamos procurando.

As medidas para uma melhor implementação de importação já foram citadas nos métodos anteriores e indico veementemente que sejam aplicadas.

Vale dizer que normalmente adicionamos o import no início do arquivo, porém você deve saber que a importação pode ser realizada em qualquer lugar do código, até mesmo dentro de funções e loops, ao fazer por exemplo o import em uma função e chamar a mesma mais de uma vez os símbolos vão ser importados uma única vez em escopo local, o que é importado em escopo global é a função em questão ( Novamente, dependendo do escopo da mesma ).

Se você estiver criando seu próprio modulo e não deseja ficar reiniciando o interpretador diversas vezes para que as mudanças sejam aplicadas, então utilize a função reload ( module ).

Uma última dica sobre os módulos são os dois métodos dir () e help (), ao importar um modulo você pode usar estes dois métodos pra saber como usar o modulo ou oque o mesmo trás, o dir lista os itens do módulo ou do programa inteiro caso o mesmo seja implementado sem nenhum argumento, já o help lhe mostra a doc string do módulo como um todo ou apenas de um método especifico passado como argumento. — Para sair da tela que se abre ao utilizar help basta você teclar a letra ‘ q ‘. Doc strings são criadas com a notação de comentário de multiplas linhas em Python.

Easter Eggs : Para visualizar as funções embutidas no interpretador Python você pode estar importando __builtin__ em Python 2 ou em Python 3 __future__ e utilizando o método dir em tal modulo importado para visualizar. — Em Python 3 basta passar como parâmetro : __future__.__package__. Importe o zen do python : import this.

Muitos temas como ambiente virtual ( Virtual Env, Py Env, Virtual Env Wrapper ), paths, namespaces, inicializador de pacotes, estrutura de pacotes, bloqueamento de from module import * … dentre outros não foram comentados aqui, porém dependendo do feedback estarei criando novos artigos com esse tema, então caso tenha curtido compartilhe, curta e comente o mesmo. Caso encontre algum erro porfavor entre em contato, esse artigo foi criado as quatro da manhã ao som de Desmeon, então acredito é passível a erros. Se você curte Python fica a dica de uma apresentação sobre Web Scrapper em Python que fiz há algum tempo.

The import system — Python 3.7