【问题标题】:What are the rules for __all__ and relative imports?__all__ 和相对导入的规则是什么?
【发布时间】:2013-05-31 06:20:30
【问题描述】:

在一个包中,我在每个模块目录的__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/__init__.py 中有__all__ 数组,符号pkgname.db.foobar 是否可见? IE。 __all__ 数组是否只影响直接模块或任何更低级别?

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

【问题讨论】:

    标签: python python-2.7


    【解决方案1】:

    __all__ 在您描述的情况下无效。它只会影响您执行from package import * 时发生的情况。请参阅 the documentationprevious questions(我通过谷歌搜索找到了 python __all__)。

    【讨论】:

    • 我使用了各种组合的所有搜索词,但没有找到那个链接。谢谢。也感谢您的迅速答复。所以据我所知,__all__ 只与* 相关,与其他任何事情无关。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-01
    • 2018-07-20
    • 2020-02-04
    • 1970-01-01
    • 2015-10-12
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多