{ "metadata": { "name": "" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "import import\n", "=============\n", "\n", "- dive into Python import statement\n", "-----------------------------------\n", "\n", "Konrad Ha\u0142as (@konradhalas)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Few words about me\n", "==================\n", "\n", "* PyWaw co-organizer\n", "* developer in SUNSCRAPERS\n", "* MutPy author" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Agenda\n", "======\n", "\n", "* presentation purpose\n", "* basic info\n", "* syntax history\n", "* inside machinery\n", "* best practices\n", "* common problems" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Presentation purpose\n", "====================\n", "\n", "* understand how import statement works\n", "* learn how to override standard import behavior\n", "* prepare to meet with \"magic\" import code in other projects\n", "* do it well and avoid problems" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What is purpose of import statement?\n", "====================================\n", "\n", "* it allows to use code from other modules\n", "* it allows to split code into multiple modules" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "What does import statement do?\n", "==============================\n", "\n", "* find a module\n", "* initialize it if necessary\n", "* define a name or names in the local namespace " ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Syntax history\n", "==============" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python 1.0.0 - 1994\n", "===================\n", "\n" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "
\n", " import_stmt: \"import\" identifier (\",\" identifier)*\n", " | \"from\" identifier \"import\" identifier (\",\" identifier)*\n", " | \"from\" identifier \"import\" \"*\"\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python 1.5.0 - 1997\n", "===================" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "
\n", " import_stmt: \"import\" module (\",\" module)* \n", " | \"from\" module \"import\" identifier (\",\" identifier)*\n", " | \"from\" module \"import\" \"*\" \n", " module: (identifier \".\")* identifier\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python 2.0.0 - 2000\n", "===================" ] }, { "cell_type": "raw", "metadata": {}, "source": [ "
\n", " import_stmt: \"import\" module [\"as\" name] (\",\" module [\"as\" name] )* \n", " | \"from\" module \"import\" identifier [\"as\" name]\n", " (\",\" identifier [\"as\" name] )*\n", " | \"from\" module \"import\" \"*\" \n", " module: (identifier \".\")* identifier\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Python 2.5.0 - 2006\n", "===================" ] }, { "cell_type": "raw", "metadata": { "slideshow": { "slide_type": "-" } }, "source": [ "
\n", " import_stmt: \"import\" module [\"as\" name] ( \",\" module [\"as\" name] )*\n", " | \"from\" relative_module \"import\" identifier [\"as\" name]\n", " ( \",\" identifier [\"as\" name] )*\n", " | \"from\" relative_module \"import\" \"(\" identifier [\"as\" name]\n", " ( \",\" identifier [\"as\" name] )* [\",\"] \")\"\n", " | \"from\" module \"import\" \"*\"\n", " module : (identifier \".\")* identifier\n", " relative_module : \".\"* module | \".\"+\n", " name : identifier\n", "" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "import statement machinery\n", "==========================\n", "\n", "* defined in **PEP 302** (\"New Import Hooks\")\n", "* introduced in **Python 2.3** (2003)\n", "* complete integration in **Python 3.3** (2012)" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Let's start...\n", "==============" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "Machinery structures\n", "====================\n", "\n", "1. `sys.modules`\n", "2. `sys.meta_path`\n", "3. `sys.path`\n", "4. `sys.path_hooks`\n", "5. `sys.path_importer_cache`" ] }, { "cell_type": "markdown", "metadata": { "slideshow": { "slide_type": "slide" } }, "source": [ "`sys.modules`\n", "=============\n", "\n", "This is a dictionary that maps module names to modules which have already been loaded." ] }, { "cell_type": "code", "collapsed": false, "input": [ "import sys\n", "\n", "sys.modules" ], "language": "python", "metadata": { "slideshow": { "slide_type": "slide" } }, "outputs": [ { "metadata": {}, "output_type": "pyout", "prompt_number": 1, "text": [ "{'IPython':