Python:相对导入导入整个包

Python:相对导入导入整个包,python,Python,我刚刚注意到相对重要性如下: from .foo import myfunc print myfunc # ok print foo # ok 导入foo和myfunc。这种行为是否有记录在案?我可以禁用它吗 --更新 基本上问题如下 bar/foo/\uuuuuu init\uuuuuuu.py: __all__ = ['myfunc'] def myfunc(): pass from .foo import * # here I expect that there is only

我刚刚注意到相对重要性如下:

from .foo import myfunc
print myfunc  # ok
print foo  # ok
导入foo和myfunc。这种行为是否有记录在案?我可以禁用它吗

--更新

基本上问题如下

bar/foo/\uuuuuu init\uuuuuuu.py

__all__ = ['myfunc']

def myfunc(): pass
from .foo import *
# here I expect that there is only myfunc defined
import foo
from bar import *  # this import shadows original foo
bar/\uuuuu init\uuuuuuuuuy.py

__all__ = ['myfunc']

def myfunc(): pass
from .foo import *
# here I expect that there is only myfunc defined
import foo
from bar import *  # this import shadows original foo
main.py

__all__ = ['myfunc']

def myfunc(): pass
from .foo import *
# here I expect that there is only myfunc defined
import foo
from bar import *  # this import shadows original foo

我也可以将
\uuuuuuuuuuuuuuuuu
添加到
栏/\uuuuuu init\uuuuuuuuuuuy.py
中,但这样我必须在几个地方重复名称。

我假设您的包布局是

my_package/
    __init__.py
        from .foo import myfunc
    foo.py
        def myfunc(): pass
来自.foo import myfunc的语句
首先导入模块
foo
,通常不在本地范围中引入任何名称。在这第一步之后,
myfunc
被导入本地名称空间

但是,在这种特殊情况下,第一步还将模块导入本地名称空间:导入时将包的子模块放入包的名称空间中,而不管从何处导入。由于
\uuuu init\uuuu.py
也在包的名称空间中执行,因此与本地名称空间进行conincide时会发生这种情况


你不能合理地禁止这种行为。如果您不想在包的名称空间中使用名称
foo
,我的建议是将模块重命名为
\u foo
,将其标记为内部。

请提供有关包布局和这些语句出现的文件的信息。(我猜这些行在
\uuuu init\uuu.py
中)@SvenMarnach,是的,init.py。我将更新问题。这是避免通配符导入的另一个原因。您实际的问题似乎是来自bar导入的
*
隐藏了一个名称。这是其中一个。顺便说一句,绝对导入的行为是相同的:
from bar.foo import myfunc
谢谢。出于某种原因,我认为这种行为是相对导入所特有的,但实际上绝对导入的行为是相同的。我很幸运,我以前没有碰到过这种行为:)@VladimirMihailenco:请注意,“这种行为”也是Python唯一明智的做法。
import
语句导入了
my_package.foo
,因此导入之后,
my_package.foo
应该可以使用。是的,我没有任何借口:)看起来我一直在误用
\u all\u
和通配符导入。