在 Python 中导入模块时什么时候使用 __all__?

When is __all__ used while importing a module in Python?

假设有这样一个问候语模块:

__all__ = []

def offer(func):
   __all__.append(func.__name__)
   return func

@offer
def spanish():
   return "Hola!"

@offer
def japanese():
   return "Konnichiwa"

from greetings import * 为 运行 时,解释器何时决定导入什么?

__all__ 告诉遇到 from package import * 时应该导入的模块名称列表。

例如, 如果未定义 __all__,语句 from greetings.languages import * 不会将包 greetings.languages 中的所有子模块导入当前命名空间;它仅确保已导入包 greetings.languages(可能 运行 __init__.py 中的任何初始化代码),然后导入包中定义的任何名称。

When does the interpreter decide what to import when from greetings import * is run?

当你说 from greetings import * 时,解释器加载并执行 greeting 模块,然后它将 __all__ 列表中提到的对象引用回当前模块的全局命名空间,以便你可以使用__all__.

中的那些符号

我想您猜对了,因为您在模块的开头定义了 __all__ 并且它是空的,不会导入任何内容。不,事实并非如此。