【问题标题】:When is __all__ used while importing a module in Python?在 Python 中导入模块时何时使用 __all__?
【发布时间】:2022-01-09 20:00:40
【问题描述】:

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

__all__ = []

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

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

@offer
def japanese():
   return "Konnichiwa"

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

【问题讨论】:

    标签: python module package


    【解决方案1】:

    解释器何时决定何时从问候语中导入什么 import * 运行了吗?

    当您说from greetings import * 时,解释器加载并执行问候模块,然后它将__all__ 列表中提到的对象引用回当前模块的全局命名空间,以便您可以使用@987654323 中的这些符号访问它们@。

    我想你猜到了,因为你在模块的开头定义了__all__,它是空的,什么都不会被导入。不,事实并非如此。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我认为 OP 知道 __all__ 做了什么,并且想知道何时该变量在导入过程中发挥作用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 2017-12-26
      相关资源
      最近更新 更多