{ "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": {} } ] }