2

我有以下文件:

./main.py
./lib/__init__.py
./lib/lib.py

,

$ cat lib/lib.py

def method():
    return 'method'

,

$ cat lib/__init__.py

from .lib import *

,

$ cat main.py

import lib

def main():
    print(lib.lib)

if __name__=='__main__':
    main()

我不知道为什么lib.lib定义,它不是lib.py文件中的变量。有任何想法吗?

4

1 回答 1

3

lib.lib对象是包内的嵌套lip.py文件lib

导入子模块后,它也可以作为包的属性使用(除非您还在文件中包含lib名称__init__.py

Python 3.3 模块加载器(在 Python 中实现)只是将嵌套模块设置为 parent 的属性

# [find a loader and load the module object, setting sys.modules[name]]
module = sys.modules[name]
if parent:
    # Set the module as an attribute on its parent.
    parent_module = sys.modules[parent]
    setattr(parent_module, name.rpartition('.')[2], module)

Python 包文档中或多或少暗示了这种行为:

所有模块都有一个名称。子包名称通过点与它们的父包名称分开,类似于 Python 的标准属性访问语法。因此,您可能有一个名为的模块sys和一个名为 的包email,而后者又具有一个名为的子包email.mime和该子包中的一个名为 的模块email.mime.text

于 2013-07-03T12:30:03.487 回答