据我从Python文档中了解,
让我举个例子。考虑以下文件层次结构:
但最后一个返回结果是
我是否遗漏了什么?这是否是预期的行为?原因何在?
在这种情况下,情况似乎更加奇怪:
现在我在根目录之外运行这个程序:
为什么在
from package import x
语句应该只将x
而非package
绑定到当前名称空间中。但实际上,如果package
是一个相对名称,则有时它也会被绑定!让我举个例子。考虑以下文件层次结构:
root/
package/
__init__.py
subpackage/
__init__.py
subpackage/__init__.py:
foo = 42
package/__init__.py:
from os import name
from .subpackage import foo
print(globals().get('name'))
print(globals().get('os'))
print(globals().get('foo'))
print(globals().get('subpackage'))
现在让我们从根
目录中运行Python解释器(无论是v2还是v3),并执行以下命令:
>>> import package
前三行输出是可以预测的:
posix
None
42
但最后一个返回结果是
<module 'package.subpackage' ...>
而不是None
,这让我有些困惑。我是否遗漏了什么?这是否是预期的行为?原因何在?
在这种情况下,情况似乎更加奇怪:
root/
__init__.py # Empty.
package/
__init__.py
another_package/
__init__.py
another_package/__init__.py:
bar = 33
package/__init__.py:
from ..another_package import bar
print(globals().get('another_package'))
现在我在根目录之外运行这个程序:
>>> import root.package
None # OK.
>>> dir(root.package)
['__builtins__', ..., '__path__', 'bar'] # OK.
>>> dir(root)
['__builtins__', ..., '__path__', 'another_package', 'package'] # What?!
为什么在
dir(root)
中出现了 another_package
?