__all__和相对进口的规则是什么?

时间:2013-06-04 18:22:15

标签: python python-2.7

在一个包中,我在每个模块目录的__init__.py中使用了一些检查来查看环境是否正常,然后使用from . import mod1来嵌套模块(mod1这里)。每个模块目录依次包含一个__init__.py(显然),它将导入下一个较低级别(如果有的话)。

部分__init__.py包含__all__数组,仅在import上公开某些名称。

假设我有以下“主要”脚本(spam.py):

import os, sys

if (sys.version_info[0] != 2) or (sys.version_info < (2,7)):
    sys.exit("...")
else:
    import pkgname

def main():
    pass

if __name__ == '__main__':
    main()

以及以下pkgname/__init__.py

import sys
if __name__ == '__main__':
    sys.exit(0)
else:
    from . import db
    from os.path import dirname, realpath
    sys.modules[__name__].__all__ = ['inipath']
    sys.modules[__name__].__dict__['inipath'] = dirname(realpath(__file__)) + '.ini'

以及以下pkgname/db/__init__.py

import sys
if __name__ == '__main__':
    sys.exit(0)
else:
    import sqlite3
    # ...
foobar = { 'spam' : 'egg' }

__all__ = ["foobar"]

尽管pkgname.db.foobar中有__all__数组,但仍可以看到符号pkgname/__init__.py吗?即__all__数组是否只影响立即模块或任何较低级别?

哪些规则管理Python的行为?我尝试了一些搜索,但空手而归。可能我使用了错误的搜索(__all__pythonrelative import)?

1 个答案:

答案 0 :(得分:4)

__all__对您描述的情况无效。它只影响from package import *时发生的事情。请参阅the documentation以及previous questions(我通过Google搜索python __all__找到的)。