Qual a diferença entre pacote e módulo em Python? – python

Pergunta:


Existe diferença entre um pacote e um módulo em Python? Se existe diferença, é possível dar exemplos de pacotes e módulos?

Autor da pergunta Thiago Krempser

Resposta Anderson Carlos Woss:

Módulo

Na documentação diz:

A module is a file containing Python definitions and statements. The file name is the module name with the suffix .py appended.

Isto é, um arquivo foo.py é considerado um módulo Python se possuir definições e instruções da linguagem. Ou seja, qualquer arquivo Python pode ser considerado um módulo. Para este caso, o nome do módulo seria foo, definido pelo nome do arquivo, sem a extensão.

Por exemplo:

# foo.py

def foonction ():
    print("Função no módulo foo")

Em qualquer outro arquivo Python, você poderá importar o módulo e utilizar suas definições:

# main.py

import foo

if __name__ == "__main__":
    foo.foonction() # Função no módulo foo

No glossário há:

An object that serves as an organizational unit of Python code. Modules have a namespace containing arbitrary Python objects. Modules are loaded into Python by the process of importing.

Isto é, módulo é um objeto (em Python tudo é objeto) que serve como uma unidade organizacional de código Python. Módulos têm um namespace contendo objetos Python arbitrários (instâncias, classes, funções, etc.).

Pacote

Na documentação diz:

Packages are a way of structuring Python’s module namespace by using “dotted module names”.

Isto é, o pacote é a forma de definir namespaces para os módulos, permitindo que inúmeros módulos de mesmo nome coexistam sem interferência. Basicamente, um pacote Python é um diretório que contém módulos:

sopt/
  __init__.py
  foo.py

Para utilizar um módulo de um pacote, basta importá-lo utilizando os nomes pontilhados:

# main.py

import sopt.foo

if __name__ == "__main__":
    sopt.foo.foonction() # Função no módulo foo

A diferença entre um diretório comum para um pacote Python é justamente a presença do aquivo __init__.py. Sem ele, o diretório não será considerado um pacote e os módulos ficarão inacessíveis.

No glossário há:

A Python module which can contain submodules or recursively, subpackages. Technically, a package is a Python module with an __path__ attribute.

Isto é, o pacote é um módulo que contém sub-módulos ou, recursivamente, sub-pacotes. Tecnicamente, um pacote é um módulo Python que possui o atributo __path__.

Por isso que mesmo que a documentação cita alguma funcionalidade para módulos, é permitido usá-la sobre pacotes também, pois o pacote é um módulo. Por exemplo, utilizando o parâmetro -m mod no comando python:

python -m django --version

como discutido nesta outra pergunta.

Fonte

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *