Python para Desenvolvedores

2ª edição, revisada e ampliada

Capítulo 8: Módulos


Para o Python, módulos são arquivos fonte que podem importados para um programa. Podem conter qualquer estrutura do Python e são executados quando importados. Eles são compilados quando importados pela primeira vez e armazenados em arquivo (com extensão “.pyc” ou “.pyo”), possuem namespace próprio e aceitam Doc Strings. São objetos Singleton (é carregada somente uma instância em memória, que fica disponível de forma global para o programa).

Módulos

Os módulos são localizados pelo interpretador através da lista de pastas PYTHONPATH (sys.path), que normalmente inclui a pasta corrente em primeiro lugar.

Os módulos são carregados através da instrução import. Desta forma, ao usar alguma estrutura do módulo, é necessário identificar o módulo. Isto é chamado de importação absoluta.

In [1]:
import os
print os.name
posix

Também é possível importar módulos de forma relativa:

In [2]:
from os import name
print name
posix

Por evitar problemas, como a ofuscação de variáveis, a importação absoluta é considerada uma prática de programação melhor do que a importação relativa.

Exemplo de módulo:

In [ ]:
# Arquivo calc.py

# Função definida no módulo
def media(lista):

    return float(sum(lista)) / len(lista)

Exemplo de uso do módulo:

In [4]:
# Importa o módulo calc
import calc

l = [23, 54, 31, 77, 12, 34]

# Chamada a função definida em calc
print calc.media(l)
38.5

O módulo principal de um programa tem a variável __name__ igual à __main__, então é possível testar se o módulo é o principal usando:

In [6]:
if __name__ == "__main__":
    # Aqui o código só será executado
    # se este for o módulo principal
    # e não quando ele for importado por outro programa
    pass

Com isso é fácil transformar um programa em um módulo.

Outro exemplo de módulo:

In [ ]:
"""
modutils => rotinas utilitárias para módulos
"""

import os.path
import sys
import glob

def find(txt):
    """encontra módulos que tem o nome
    contendo o parâmetro
    """

    resp = []

    for path in sys.path:
        mods = glob.glob('%s/*.py' % path)

        for mod in mods:
            if txt in os.path.basename(mod):
                resp.append(mod)

    return resp

Exemplo de uso do módulo:

In [7]:
from os.path import getsize, getmtime
from time import localtime, asctime

import modutils

mods = modutils.find('xml')

for mod in mods:

    tm = asctime(localtime(getmtime(mod)))
    kb = getsize(mod) / 1024
    print '%s: (%d kbytes, %s)' % (mod, kb, tm)
/usr/lib/python2.7/xmlrpclib.py: (50 kbytes, Fri Apr 19 16:20:45 2013)
/usr/lib/python2.7/xmllib.py: (34 kbytes, Fri Apr 19 16:20:45 2013)
/usr/lib/python2.7/dist-packages/libxml2.py: (335 kbytes, Wed May  1 14:19:10 2013)
/usr/lib/python2.7/dist-packages/drv_libxml2.py: (14 kbytes, Wed May  1 14:19:10 2013)

Dividir programas em módulos facilita o reaproveitamento e localização de falhas no código.

In [1]:
 
Out[1]: