为什么即使未定义__all__,pkg import *最终导入模块?

时间:2017-02-22 03:14:53

标签: python package python-import python-3.6

我已经以这种方式创建了一个包pkg

$ tree
.
└── pkg
    ├── foo.py
    └── __init__.py

1 directory, 2 files
susam@debian1:~/so$ cat pkg/__init__.py
susam@debian1:~/so$ cat pkg/foo.py
print('executing module foo ...')

def bar():
    print('bar')

下面的所有Python shell代码段都来自单个交互式代码 与Python解释器的会话。我已将它们分成多个 阻止在两者之间添加我自己的评论。

这是我的Python版本。

Python 3.4.2 (default, Oct  8 2014, 10:45:20)
[GCC 4.9.1] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

以下导入不会导入foo,因为__all__不是 在__init__.py中定义。

>>> from pkg import *
>>> foo.bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined
>>>

以上行为已在Python教程中描述 https://docs.python.org/3/tutorial/modules.html#importing-from-a-package

  

如果未定义__all__,则语句from sound.effects import *   不会将包sound.effects中的所有子模块导入到。{1}}中   当前命名空间它只能确保包sound.effects具有   已导入(可能正在运行任何初始化代码)   __init__.py)然后导入在中定义的任何名称   封装

以下仅导入bar()。它不会导入foo

>>> from pkg.foo import bar
executing module foo ...
>>> bar()
bar
>>> foo.bar()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'foo' is not defined

但奇怪的是,在上一次导入之后,以下导入结束了 即使foo中未定义__all__,也会导入__init__.py

>>> from pkg import *
>>> foo.bar()
bar

为什么会这样?

2 个答案:

答案 0 :(得分:0)

根据您引用的Python文档,当您使用from pkg import *时,您只导入模块foo以及__init__.py而不导入foo的功能

我怀疑您提供的最后一个代码段是有效的,因为您已经从bar()直接导入foo并在严格导入bar函数后重新导入foo建立了{之间的连接{1}}和foo

指定bar()时会遇到同样的问题吗?

答案 1 :(得分:0)

当您执行foo时,<pkg已在pkg.foo命名空间中导入为from pkg.foo import bar。因此,当您将所有名称从pkg命名空间导入当前范围时,您还会导入foo。参见:

>>> import pkg
>>> dir(pkg)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__']
>>> from pkg.foo import bar
executing module foo ...
>>> dir(pkg)
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'foo']

(我在python 2上,但这个逻辑是相同的)