Diving deep on how imports work in Python

Diving deep on how imports work in Python

Talk was given on PyCon Taiwan 2017

Talk link: https://tw.pycon.org/2017/en-us/events/talk/342865744498786414/

99f99340cf6fe31f86e8dd0a988eec7c?s=128

Tasdik Rahman

June 12, 2017
Tweet

Transcript

  1. Diving deep on how imports work in Python PyCon Taiwan,

    2017 presented by Tasdik Rahman (@tasdikrahman)
  2. But Why?

  3. Modules

  4. Terminology •Loader Loads a module •Finder Finds a module

  5. Module search path

  6. sys.path

  7. >>> import sys >>> >>> pprint(sys.path) ['', '/usr/local/Cellar/python3/3.6.0/Frameworks/ Python.framework/Versions/3.6/lib/python36.zip', '/usr/local/Cellar/python3/3.6.0/Frameworks/

    Python.framework/Versions/3.6/lib/python3.6', '/usr/local/Cellar/python3/3.6.0/Frameworks/ Python.framework/Versions/3.6/lib/python3.6/lib- dynload', '/usr/local/lib/python3.6/site-packages'] >>>
  8. Compiled Python files

  9. • __pycache__ under a name like module.version.pyc • __pycache__/spam.cpython-33.pyc •

    platform independent • regular lookup with source checking for modification.
  10. import foo

  11. 2 step process • find a module, loading and initialising

    it if necessary • define a name or names in the local namespace for the scope where the "import" statement occurs.
  12. If module is retrieved successfully

  13. import foo # foo imported and bound locally import foo.bar.baz

    
 # foo.bar.baz imported, foo bound locally import foo.bar.baz as fbb 
 # foo.bar.baz imported and bound as fbb
  14. from foo.bar import baz

  15. • find the module specified in the "from" clause, loading

    and initialising if necessary • for each of the identifiers specified in the "import" clauses: 1. check if the imported module has an attribute by that name 2. attempt to import a submodule with that name and check the imported module again for that attribute 3. if the attribute is not found, "ImportError" is raised.
  16. from foo.bar import baz # foo.bar.baz imported and bound as

    baz from foo import attr # foo imported and foo.attr bound as attr
  17. from foo import *

  18. Packages

  19. Advantages?

  20. car/ Top-level package __init__.py Initialize the car package engine/ Subpackage

    for engine behaviour __init__.py rev.py temperature.py fuel.py coolant.py ... transmission/ Subpackage for transmission __init__.py forward.py reverse.py ... infotainment/ Subpackage for infotainment system __init__.py music.py reverseparking.py chilledbeer.py ...
  21. __init__.py

  22. import car.engine.rev car.engine.rev.spin(…) # OR from car.engine import rev rev.spin(...)

    # OR from car.engine.rev import spin spin(...)
  23. __all__

  24. from car.engine import * # car/engine/__init__.py __all__ = ["temperature", "fuel",

    "coolant"]
  25. What if there is no __all__ ?

  26. Intra-package reference

  27. # car/engine/temperature from car.transmission import forward from . import forward

    from .. import transmission from ..infotainment import music
  28. Some takeaways

  29. Questions?
 
 Would be happy to take them :) http://tasdikrahman.me/


    @tasdikrahman