在 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__
并且它是空的,不会导入任何内容。不,事实并非如此。
假设有这样一个问候语模块:
__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__
并且它是空的,不会导入任何内容。不,事实并非如此。