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
和通配符导入。