我已经以这种方式创建了一个包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
为什么会这样?
答案 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上,但这个逻辑是相同的)