Criando e Conectando Módulos - Python
Em Python, um módulo é um arquivo individual com código que pode ser reutilizado em outros programas.
Para criar um módulo, é necessário criar um arquivo com a extensão *.py
Por exemplo, suponha que o arquivo principal do programa seja chamado main.py
Para isso, primeiro definimos um novo módulo: na mesma pasta onde está main.py
message.py
message.py
. ├── main.py └── message.py
Assim, o módulo será chamado message
message.py
hello = "Hello all"
def print_message(text):
print(f"Message: {text}")
Aqui, temos uma variável hello
print_message
No arquivo principal main.py
import message # importando o módulo message
# exibindo o valor da variável hello
print(message.hello) # Hello all
# chamando a função print_message
message.print_message("Hello Programício") # Message: Hello Programício
Para usar o módulo, é necessário importá-lo com o comando import
import message
Para acessar a funcionalidade do módulo, precisamos usar seu namespace. Por padrão, ele corresponde ao nome do módulo, ou seja, neste caso, o namespace é message
Após ter o namespace do módulo, podemos acessar suas funções usando a sintaxe:
message.print_message("Hello Programício")
Por exemplo, para chamar a função print_message()
message
message.print_message("Hello Programício")
Depois disso, podemos executar o script principal main.py
message.py
Hello all Message: Hello Programício
Importando Funcionalidade do Módulo no Namespace Global
Outra opção é importar a funcionalidade do módulo para o namespace global do módulo atual, usando a palavra-chave from:
from message import print_message
# chamando a função print_message do módulo message
print_message("Hello Programício") # Message: Hello Programício
# a variável hello do módulo message não está acessível, pois não foi importada
# print(message.hello)
# print(hello)
Neste caso, estamos importando a função print_message()
global
As demais funções e variáveis do módulo não estarão acessíveis (como a variável hello
from message import print_message
from message import hello
# chamando a função print_message do módulo message
print_message("Hello Programício") # Message: Hello Programício
# chamando a variável hello do módulo message
print(hello) # Hello all
Se for necessário importar todas as funcionalidades no namespace global, podemos usar o caractere asterisco *
from message import *
# chamando a função print_message do módulo message
print_message("Hello Programício") # Message: Hello Programício
# chamando a variável hello do módulo message
print(hello) # Hello all
No entanto, é importante observar que a importação para o namespace global pode gerar conflitos de nomes. Por exemplo, se houver uma função com o mesmo nome definida no arquivo atual, será chamada a última função definida:
from message import *
print_message("Hello Programício") # Message: Hello Programício - usa a função do módulo message
def print_message(some_text):
print(f"Local Text: {some_text{")
print_message("Hello Programício") # Local Text: Hello Programício - usa a função do arquivo atual
Neste caso, a função print_message()
Definindo Alias
Ao importar um módulo ou suas funcionalidades, podemos definir um alias(apelido) para o nome do módulo, usando a palavra-chave as
import message as msg
# exibindo o valor da variável hello
print(mes.hello) # Hello all
# chamando a função print_message
msg.print_message("Hello Programício") # Message: Hello Programício
Neste caso, o namespace passa a se chamar msg
De forma semelhante, é possível definir aliases para funcionalidades específicas do módulo:
from message import print_message as display
from message import hello as welcome
print(welcome) # Hello all - variável hello do módulo message
display("Hello Programício") # Message: Hello Programício - função print_message do módulo message
Aqui, atribuimos o alias display
print_message
message
welcome
hello
Os aliases são úteis quando os nomes das funções ou variáveis não são ideais, por exemplo, quando são longos demais ou queremos nomes mais descritivos. Eles também ajudam a evitar conflitos de nome caso haja funcionalidades com os mesmos nomes no arquivo atual. Veja o exemplo:
from message import print_message as display
def print_message(some_text):
print(f"Local Text: {some_text}")
# função print_message do módulo message
display("Hello Programício") # Message: Hello Programício
# função print_message do arquivo atual
print_message("Hello Programício") # Local Text: Hello Programício
Nome do Modulo
No exemplo acima, o módulo main.py
message.py
main.py
message.py
message.py
Ao executar um módulo, o ambiente define seu nome e o atribui à variável global __name__
__main__
.py
message.py
hello = "Hello all"
def print_message(text):
print(f"Message: {text}")
def main():
print_message(hello)
if __name__ == "__main__":
main()
Neste caso, adicionamos a função main
message.py
Observe a chamada da função main()
if __name__ == "__main__":
main()
A variável __name__
__main__
Portanto, se executarmos o script message.py
__main__
__name__
if
main
Porém, se executarmos outro script e importarmos message.py
__name__
message.py
message
main
Esse método de verificar o nome do módulo é uma prática recomendada em Python, em vez de chamar a função main
No arquivo main.py
import message
def main():
message.print_message("Hello work") # Message: Hello work
if __name__ == "__main__":
main()