Importing deeply nested modules in Python

旧巷老猫 提交于 2020-01-05 03:51:07

问题


Consider the following case in Python 3.6:

basepackage
    |---__init__.py
    |---package
            |---__init__.py
            |---subpackage
                    |---__init__.py
                    |---module.py

Important detail: inside basepackage.package.__init__.py there's:

from basepackage.package.subpackage.module import AClass as AliasedClass

Now, let's say inside basepackage.package.subpackage.module.py we want to use:

import basepackage.package.subpackage.module as aliased_module [1]

The result is:

AttributeError: module 'basepackage' has no attribute 'package'

with a stack trace listing following culprit statements (in the below order):

from basepackage.package.subpackage.module import AClass as AliasedClass
import basepackage.package.subpackage.module as aliased_module

But if instead of [1] one'd like to use:

from basepackage.package.subpackage import module as aliased_module [2]

then everything works.

How is [1] so much different than [2] that the former results in an error and the latter not?


回答1:


For the first option (import basepackage.package.subpackage.module as aliased_module) to work, these conditions have to be met:

  • basepackage/__init__.py has to contain a line similar to from . import package (the name package has to be defined inside this basepackage/__init__.py file)
  • basepackage/package/__init__.py has to contain a line similar to from . import subpackage
  • basepackage/package/subpackage/__init__.py has to contain a line similar to from . import module

Note: the import statements inside the __init__.py files can also be absolute instead of relative paths.


For the second option (from basepackage.package.subpackage import module as aliased_module), it is enough if there are empty __init__.py files at each level, as long as these __init__.py files exist.



来源:https://stackoverflow.com/questions/57772706/importing-deeply-nested-modules-in-python

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!