Motivação:
Para permitir isso, o Python tem uma maneira de colocar as definições em um arquivo e então usá-las em um script ou em uma execução interativa do interpretador. Tal arquivo é chamado de módulo; definições de um módulo podem ser importadas por outros módulos, por um script ou diretamente no Python Shell.
Um módulo é um arquivo contendo definições e instruções Python. O nome do arquivo é o nome do módulo acrescido do sufixo .py
.
Por exemplo, use seu editor de texto favorito para criar um arquivo chamado ponto.py
no diretório atual com o seguinte conteúdo:
import math def distancia(Pa, Pb): """ Calcula a distância entre dois pontos Pa = [xa,ya] e Pb = [xb,yb]""" xa,ya = Pa #xa,ya = Pa[0],Pa[1] xb,yb = Pb #xa,ya = Pb[0],Pb[1] dx = xb-xa dy = yb-ya d = math.sqrt(dx*dx + dy*dy) return dConsiderando um ponto como uma lista com dois elementos reais, correspondendo às coordenadas x e y, o módulo
ponto
acima
define uma função para calcular a distância euclidiana
entre dois pontos fornecidos.
Para calcular a raiz quadrada, usamos a função
sqrt
do módulo math
do Python, usando a sintaxe math.sqrt
.
Agora, crie um segundo arquivo chamado poligono.py
no mesmo diretório com o seguinte conteúdo:
import ponto def perimetro(Pol): """Calcula o perímetro de um polígono Pol = [P1, P2, ..., Pn] composto por n pontos.""" peri = 0.0 #perímetro Pant = Pol[-1] #ponto anterior for Pi in Pol: dist = ponto.distancia(Pant, Pi) peri += dist Pant = Pi return periConsiderando um polígono como uma lista dos seus vértices consecutivos, o módulo
poligono
acima
define uma função para calcular o perímetro de um polígono
fornecido, ou seja, a soma de todos os seus lados. Porém, como cada
vértice é o ponto comum entre os lados do polígono,
podemos calcular o tamanho de cada lado usando a função
distancia
do módulo ponto
.
Para isso, precisamos primeiramente importar o módulo ponto
, usando o comando import ponto
.
Feito isso, podemos então chamar a função
distancia
usando a sintaxe
ponto.distancia
.
Agora entre no interpretador Python e importe o módulo com o seguinte comando:
>>> import poligono
poligono
é importado, o interpretador procura um módulo embutido com este nome. Se não encontra, procura um arquivo chamado poligono.py
em uma lista de diretórios incluídos na variável sys.path
.
>>> import sys
>>> print(sys.path)
['', '/home/pmiranda', '/usr/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/home/pmiranda/.local/lib/python3.5/site-packages', '/usr/local/lib/python3.5/dist-packages', '/usr/lib/python3/dist-packages']
Se o comando import poligono
não estiver funcionando, você deve incluir o diretório que contém os arquivos poligono.py
e ponto.py
na lista sys.path
.
No meu caso os arquivos estão no diretório do Linux /home/pmiranda/Desktop/MAC2166_1s20/modulos
. Logo, podemos usar:
>>> sys.path.append('/home/pmiranda/Desktop/MAC2166_1s20/modulos')
No caso do sistema operacional Windows, a estrutura das pastas será diferente
e você deve usar um comando similar a este: sys.path.append('C:\\user\\mydir')
O comando import poligono
não coloca os nomes das funções definidas em poligono
diretamente na tabela de símbolos atual; isso coloca somente o nome do módulo poligono
. Usando o nome do módulo você pode acessar as funções através da sintaxe nome_do_módulo.nome_da_função
:
>>> poligono.perimetro([[0,0],[1,0],[1,1],[0,1]])
4.0
Se pretender usar uma função muitas vezes, você pode atribui-lá a um nome local:
>>> perimetro = poligono.perimetro
>>> perimetro([[0,0],[1,0],[1,1],[0,1]])
4.0
importlib.reload()
para recarregar o módulo:
>>> import importlib
>>> importlib.reload(poligono)
Dentro de um módulo, o nome do módulo (como uma string) está disponível como o valor da variável global __name__
.
>>> poligono.__name__
'poligono'
Por exemplo, se você adicionar o código
print(__name__)
ao final
do arquivo poligono.py
,
ao importar esse módulo em um Python Shell recém-aberto teremos:
>>> import poligono
poligono
No entanto, quando você roda um módulo Python no modo script (clicando em "Run Module" tal como indicado na figura abaixo),
o código no módulo será executado, da mesma forma que quando
é importado, mas com a variável
__name__
com
valor "__main__"
,
ao invés de valer a string do nome do módulo
"poligono"
.
Ou seja, no Python Shell teremos como saída:
Isto significa que adicionando este código abaixo ao final do módulo
poligono
(no lugar do print(__name__)
):
if __name__ == "__main__": per = perimetro([[0,0],[1,0],[1,1],[0,1]]) print("Perímetro:",per)você pode tornar o arquivo utilizável tanto como script quanto como um módulo importável, porque o código acima só roda se o módulo é executado como arquivo "principal". Se o módulo é importado, o código não é executado.
Ou seja, se rodarmos agora o módulo poligono
no modo script, teremos como saída:
Isso é frequentemente usado para fornecer uma interface de usuário conveniente para um módulo, ou para realizar testes (rodando o módulo como um script executa um conjunto de testes) para verificar a integridade do módulo.