{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "[Python for Developers](http://ricardoduarte.github.io/python-for-developers/#content)\n", "===================================\n", "First Edition\n", "-----------------------------------\n", "\n", "Chapter 8: Modules\n", "=============================\n", "_____________________________\n", "For Python, modules are source files that can be imported into a program. They can contain any Python structure and run when imported. They are compiled when first imported and stored in a file (with the extension \".pyc\" or \".pyo\"), have their own *namespaces* and support *Doc Strings*. They are singleton objects (only one instance is loaded into memory, which is available globally for the program).\n", "\n", "![Modules](files/bpyfd_diags6.png)\n", "\n", "The modules are located by the interpreter through the list of folders `PYTHONPATH` (sys.path), which usually includes the current directory first.\n", "\n", "The modules are loaded with the `import` statement. Thus, when using a module structure, it is necessary to identify the module. This is called absolute import." ] }, { "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": [ "You can also import modules with relative form:" ] }, { "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": [ "To avoid problems such as variable obfuscation, the absolute import is considered a better programming practice than the relative import.\n", "\n", "Example of module:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# File calc.py\n", "\n", "# Function defined in module\n", "def average(list):\n", "\n", " return float(sum(list)) / len(list)" ], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Example of module usage:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "# Imports calc module\n", "import calc\n", "\n", "l = [23, 54, 31, 77, 12, 34]\n", "\n", "# Calls the function defined in calc\n", "print calc.average(l)" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "38.5\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "The main module of a program has the variable `__name__` equals to `__main__`, thus it is possible to test if the main module:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "if __name__ == \"__main__\":\n", " # Code here will only be run \n", " # if it is the main module\n", " # and not when it is imported by another program\n", " pass" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "That way it is easy to turn a program into a module.\n", "\n", "Another module example:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "\"\"\"\n", "modutils => utility routines for modules\n", "\"\"\"\n", "\n", "import os.path\n", "import sys\n", "import glob\n", "\n", "def find(txt):\n", " \"\"\"find modules with name containing the parameter\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": [ "Example module use:" ] }, { "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": [ "Splitting programs into modules makes it easy to reuse and locate faults in the code." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [ { "html": [ "\n", "" ], "output_type": "pyout", "prompt_number": 1, "text": [ "" ] } ], "prompt_number": 1 } ], "metadata": {} } ] }