{
"metadata": {
"name": "Capitulo8_Modulos"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"[Python para Desenvolvedores](http://ricardoduarte.github.io/python-para-desenvolvedores/#conteudo)\n",
"===================================\n",
"2ª edi\u00e7\u00e3o, revisada e ampliada\n",
"-----------------------------------\n",
"\n",
"Cap\u00edtulo 8: M\u00f3dulos\n",
"=============================\n",
"_____________________________\n",
"Para o Python, m\u00f3dulos s\u00e3o arquivos fonte que podem importados para um programa. Podem conter qualquer estrutura do Python e s\u00e3o executados quando importados. Eles s\u00e3o compilados quando importados pela primeira vez e armazenados em arquivo (com extens\u00e3o \u201c.pyc\u201d ou \u201c.pyo\u201d), possuem *namespace* pr\u00f3prio e aceitam *Doc Strings*. S\u00e3o objetos Singleton (\u00e9 carregada somente uma inst\u00e2ncia em mem\u00f3ria, que fica dispon\u00edvel de forma global para o programa).\n",
"\n",
"![M\u00f3dulos](files/bpypd_diags6.png)\n",
"\n",
"Os m\u00f3dulos s\u00e3o localizados pelo interpretador atrav\u00e9s da lista de pastas `PYTHONPATH` (sys.path), que normalmente inclui a pasta corrente em primeiro lugar.\n",
"\n",
"Os m\u00f3dulos s\u00e3o carregados atrav\u00e9s da instru\u00e7\u00e3o `import`. Desta forma, ao usar alguma estrutura do m\u00f3dulo, \u00e9 necess\u00e1rio identificar o m\u00f3dulo. Isto \u00e9 chamado de importa\u00e7\u00e3o absoluta."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"import os\n",
"print os.name"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"posix\n"
]
}
],
"prompt_number": 1
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Tamb\u00e9m \u00e9 poss\u00edvel importar m\u00f3dulos de forma relativa:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from os import name\n",
"print name"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"posix\n"
]
}
],
"prompt_number": 2
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Por evitar problemas, como a ofusca\u00e7\u00e3o de vari\u00e1veis, a importa\u00e7\u00e3o absoluta \u00e9 considerada uma pr\u00e1tica de programa\u00e7\u00e3o melhor do que a importa\u00e7\u00e3o relativa.\n",
"\n",
"Exemplo de m\u00f3dulo:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Arquivo calc.py\n",
"\n",
"# Fun\u00e7\u00e3o definida no m\u00f3dulo\n",
"def media(lista):\n",
"\n",
" return float(sum(lista)) / len(lista)"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exemplo de uso do m\u00f3dulo:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"# Importa o m\u00f3dulo calc\n",
"import calc\n",
"\n",
"l = [23, 54, 31, 77, 12, 34]\n",
"\n",
"# Chamada a fun\u00e7\u00e3o definida em calc\n",
"print calc.media(l)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"38.5\n"
]
}
],
"prompt_number": 4
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"O m\u00f3dulo principal de um programa tem a vari\u00e1vel `__name__` igual \u00e0 `__main__`, ent\u00e3o \u00e9 poss\u00edvel testar se o m\u00f3dulo \u00e9 o principal usando:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"if __name__ == \"__main__\":\n",
" # Aqui o c\u00f3digo s\u00f3 ser\u00e1 executado\n",
" # se este for o m\u00f3dulo principal\n",
" # e n\u00e3o quando ele for importado por outro programa\n",
" pass"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 6
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Com isso \u00e9 f\u00e1cil transformar um programa em um m\u00f3dulo.\n",
"\n",
"Outro exemplo de m\u00f3dulo:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"\"\"\"\n",
"modutils => rotinas utilit\u00e1rias para m\u00f3dulos\n",
"\"\"\"\n",
"\n",
"import os.path\n",
"import sys\n",
"import glob\n",
"\n",
"def find(txt):\n",
" \"\"\"encontra m\u00f3dulos que tem o nome\n",
" contendo o par\u00e2metro\n",
" \"\"\"\n",
"\n",
" resp = []\n",
"\n",
" for path in sys.path:\n",
" mods = glob.glob('%s/*.py' % path)\n",
"\n",
" for mod in mods:\n",
" if txt in os.path.basename(mod):\n",
" resp.append(mod)\n",
"\n",
" return resp"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Exemplo de uso do m\u00f3dulo:"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from os.path import getsize, getmtime\n",
"from time import localtime, asctime\n",
"\n",
"import modutils\n",
"\n",
"mods = modutils.find('xml')\n",
"\n",
"for mod in mods:\n",
"\n",
" tm = asctime(localtime(getmtime(mod)))\n",
" kb = getsize(mod) / 1024\n",
" print '%s: (%d kbytes, %s)' % (mod, kb, tm)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"/usr/lib/python2.7/xmlrpclib.py: (50 kbytes, Fri Apr 19 16:20:45 2013)\n",
"/usr/lib/python2.7/xmllib.py: (34 kbytes, Fri Apr 19 16:20:45 2013)\n",
"/usr/lib/python2.7/dist-packages/libxml2.py: (335 kbytes, Wed May 1 14:19:10 2013)\n",
"/usr/lib/python2.7/dist-packages/drv_libxml2.py: (14 kbytes, Wed May 1 14:19:10 2013)\n"
]
}
],
"prompt_number": 7
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Dividir programas em m\u00f3dulos facilita o reaproveitamento e localiza\u00e7\u00e3o de falhas no c\u00f3digo."
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [],
"language": "python",
"metadata": {},
"outputs": [
{
"html": [
"\n",
""
],
"output_type": "pyout",
"prompt_number": 1,
"text": [
""
]
}
],
"prompt_number": 1
}
],
"metadata": {}
}
]
}