{ "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':