Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
1.2k views
in Technique[技术] by (71.8m points)

import - Importing deeply nested modules in Python

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?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...