我是否应该定义__all__,即使我在模块中使用下划线作为隐藏函数和变量的前缀?

Jim*_*y C 2 python

从模块的外部用户的角度来看,都是必要的吗?

根据我的理解,通过使用下划线正确地加上隐藏函数前缀,它基本上与显式定义相同__all__,但我一直看到开发人员在他们的代码中执行这两项操作.这是为什么?

Mar*_*ers 7

from modulename import *名称以下划线开头的模块导入时确实会跳过.

但是,模块很少包含公共API对象.通常你也进行了导入以支持代码,并且这些名称在模块中也是全局的.没有__all__,这些名称也将成为进口的一部分.

换句话说,除非您想os在以下示例中"导出",否则应使用__all__:

import os
from .implementation import some_other_api_call

_module_path = os.path.dirname(os.path.abspath(__file__))
_template = open(os.path.join(_module_path, 'templates/foo_template.txt')).read()

VERSION = '1.0.0'

def make_bar(baz, ham, spam):
    return _template.format(baz, ham, spam)

__all__ = ['some_other_api_call', 'make_bar']
Run Code Online (Sandbox Code Playgroud)

因为没有__all__列表,Python无法区分some_other_api_callos此处以及使用时不应导入哪一个from ... import *.

你可以通过重命名所有的导入来解决这个问题,所以import os as _os,这只是让你的代码不那么可读.

显式导出列表总是很好.正如Python的Zen告诉你的那样,显式优于隐式.