网易首页 > 网易号 > 正文 申请入驻

Python:__all__ 详解

0
分享至

在 Python 的模块与包体系中,__all__ 是一个看似简单却极具控制力的变量。它用于定义一个模块或包在使用 from xxx import * 时的公开接口(Public API),是实现封装、接口管理与工程化代码结构的关键工具。

Python 的导入机制向来强调“显式优于隐式”,而 __all__ 正体现了这一哲学:作者显式决定用户能看到什么、不能看到什么。

一、__all__ 的作用概述

在任何模块或者包的 __init__.py 中,只要定义了:

__all__ = ["name1", "name2", ...]

那么当用户执行:

from module import *

只有 __all__ 中列出的名称会被导入。

它本质上是一个导出白名单。

如果模块或包没有定义 __all__,那么:

from module import *

将导入所有不以下划线 _ 开头的名称。

示例:

def func(): pass

执行:

print(dir())

结果包含:

func

而 _y 被视为“内部名称”,不会被导入。

这也是为什么企业级项目往往认为 from ... import * 不够安全:

没定义 __all__ 时,公开接口是隐式推断的,容易产生污染与冲突。

二、__all__ 的标准写法与行为

(1)基本示例

    return "hidden"

用户端:

_secret()   # 报错:未导入

_secret 即使不以下划线开头,也不会被导入。

(2)在包的 __init__.py 中使用 __all__

位置结构:

    b.py

__init__.py:

__all__ = ["func_a", "func_b"]

用户只需:

from mypkg import *

即可获得统一后的公共接口。

(3)在多级包中的控制

层级结构:

        io.py

两层都可使用 __all__ 各自管理对上层的可见性,最终决定用户能访问什么。

三、__all__ 的设计动机

企业级项目通常强调 API 的稳定性与可控性,而 __all__ 能解决三个工程痛点。

(1)防止命名污染(避免 * 导入把内部逻辑暴露出去)

没有 __all__ 时,一个模块中新增任何“非下划线名称”,都会被自动公开,导致 API 不稳定。

(2)构建“面向用户的公共接口”

特别是在复杂包的 __init__.py 中,可以用 __all__ 构建统一接口层,让用户与内部结构解耦。

(3)稳固的封装机制

封装不仅是“不让别人看到”,更重要是“不让别人依赖内部结构”。

__all__ 让维护者可以明确声明 “这是对外 API,其余均为内部实现”。

四、常见使用模式

(1)显式导出函数与类

def utility(): ...

(2)阻止特定名称被导入

即使不以下划线开头,也可阻止导出:

__all__ = ["api"]

(3)组合多个子模块的接口成为统一 API

__all__ = ["add", "sub", "format_name"]

这让包即使内部结构复杂,对外接口仍保持整洁一致。

(4)动态构建 __all__

有时模块想自动暴露所有非下划线名称,但仍显式控制:

__all__ = [name for name in globals() if not name.startswith("_")]

或按规则过滤:

__all__ = [name for name in globals() if callable(globals()[name])]

适用于自动化驱动的大型工具包。

五、常见误区澄清

误区 1:__all__ 会影响普通 import

例如:

mathutils.func()  # 无论 __all__ 是否包含 func,都可访问

__all__ 仅影响 from module import *,不影响普通 import。

误区 2:定义了 __all__ 下划线函数就一定隐藏

错。

__all__ = ["_internal"]

from module import * 仍会导入 _internal,因为作者将其显式加入。

误区 3:在包中使用 __all__ 会自动导入模块

不会。

__all__ = ["a", "b"]

不会自动导入子模块 a.py 或 b.py,需要你显式写:

from . import a, b

六、完整示例(构建可维护的公共接口)

目录:

    multiply.py

add.py:

    return a + b

multiply.py:

    return a * b

__init__.py:

print("mypkg loaded.")

用户端:

print(mul(2, 5))

小结

__all__ 是 Python 模块化体系中极具工程价值的接口控制工具。它通过显式定义“允许被星号导入的名称”,使开发者能够严格管理对外 API,避免命名污染,并让大型包的结构清晰而稳定。它不影响普通导入,但能有效隔离内部实现,是构建高质量可维护库的重要机制。

熟练使用 __all__,意味着你不仅理解模块的组织方式,更真正理解了 Python 的“接口哲学”——清晰、显式、可控。


点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
释某被批捕,传闻逐一坐实!

释某被批捕,传闻逐一坐实!

梳子姐
2025-11-16 18:23:57
沈阳一停车场圈占公共免费车位牟利,市民质疑:谁给你的权力?

沈阳一停车场圈占公共免费车位牟利,市民质疑:谁给你的权力?

沈阳公交网小林
2025-11-17 00:13:39
真嗑药了?40岁菲尔普斯已老态龙钟:现身悉尼 奥运23金+资产7亿

真嗑药了?40岁菲尔普斯已老态龙钟:现身悉尼 奥运23金+资产7亿

风过乡
2025-11-14 08:03:19
李在明修改尹锡悦政策,对中国表述变了,韩媒:这是间接对华示好

李在明修改尹锡悦政策,对中国表述变了,韩媒:这是间接对华示好

坠入二次元的海洋
2025-11-17 00:52:59
高市早苗涉台言论受日本舆论反对,看到中方强硬立场日本网民指责高市早苗“闯大祸”

高市早苗涉台言论受日本舆论反对,看到中方强硬立场日本网民指责高市早苗“闯大祸”

环球网资讯
2025-11-14 22:18:42
日本议员坐不住了

日本议员坐不住了

极目新闻
2025-11-16 17:20:31
全村移民加拿大,70多年没回来,广东一无人村,村民斥巨资盖别墅

全村移民加拿大,70多年没回来,广东一无人村,村民斥巨资盖别墅

boss外传
2025-11-16 13:10:03
虐待继女致死的“蛇蝎继母”被决定执行死刑!生母也应该反思

虐待继女致死的“蛇蝎继母”被决定执行死刑!生母也应该反思

细品名人
2025-11-16 07:11:09
央视镜头下,王玉雯秒了韩雨彤,短剧女主和长剧女主一眼看出区别

央视镜头下,王玉雯秒了韩雨彤,短剧女主和长剧女主一眼看出区别

情感大头说说
2025-11-17 01:33:55
人民日报专访,揭开32岁周深的真实处境,那英确实一个字都没说错

人民日报专访,揭开32岁周深的真实处境,那英确实一个字都没说错

八斗小先生
2025-11-01 08:46:54
赴日签证大变天!游客“薅羊毛”的时代或将结束...

赴日签证大变天!游客“薅羊毛”的时代或将结束...

今日日本
2025-11-13 14:05:13
谴责苏联强占北方四岛的霸权主义行径1975年10月23日《人民日报》

谴责苏联强占北方四岛的霸权主义行径1975年10月23日《人民日报》

那些看得见的老照片
2025-11-04 15:02:18
郭家一条狗引发的纠纷,愣是被身为政协委员的赵某晖作成大新闻

郭家一条狗引发的纠纷,愣是被身为政协委员的赵某晖作成大新闻

七月生活情感驿站
2025-11-16 22:50:36
美国平权政策大逆转,最高法院6:3废除种族考量,华人家庭炸锅了

美国平权政策大逆转,最高法院6:3废除种族考量,华人家庭炸锅了

壹知眠羊
2025-11-16 14:14:01
真假?大批媒体曝吴亦凡狱中绝食去世?家人也失联,知情者发声

真假?大批媒体曝吴亦凡狱中绝食去世?家人也失联,知情者发声

180视角
2025-11-12 12:05:43
戏子误国?央视公开点名,官媒狠批,这几个都是咎由自取的

戏子误国?央视公开点名,官媒狠批,这几个都是咎由自取的

阿废冷眼观察所
2025-11-17 01:44:07
日本议员叫嚣:签投降书的是中华民国,新中国没资格发表意见?

日本议员叫嚣:签投降书的是中华民国,新中国没资格发表意见?

兵国大事
2025-11-16 00:05:17
你觉不觉得她,面相变了...

你觉不觉得她,面相变了...

BenSir本色说
2025-11-16 22:07:49
陪玩陪睡不够!集体开嫖、舔手指、目无王法,阴暗面彻底藏不住了

陪玩陪睡不够!集体开嫖、舔手指、目无王法,阴暗面彻底藏不住了

好贤观史记
2025-11-09 21:58:39
喜欢一个人的眼神是藏不住的

喜欢一个人的眼神是藏不住的

贵圈真乱
2025-10-02 09:11:22
2025-11-17 02:52:49
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1591文章数 68关注度
往期回顾 全部

科技要闻

雷军,怒了!刚刚连发多条微博

头条要闻

中国公民需谨慎前往日本 四大原因披露

头条要闻

中国公民需谨慎前往日本 四大原因披露

体育要闻

最佳新秀候选!2028美国男篮有他一个位置

娱乐要闻

CEO爆料肖战《藏海传》狂赚几十亿!

财经要闻

房源暗中调价 央企举报广州国资房企

汽车要闻

"冰彩沙"全配齐 红旗HS6 PHEV预售17.88万起

态度原创

房产
旅游
手机
公开课
军事航空

房产要闻

首开狂卖6.68亿!海口这个顶级教育红盘,引爆海口楼市!

旅游要闻

一票游多日,一举能多得|新京报社论

手机要闻

古尔曼:苹果iPhone正经历史上最大变革,iPhone 18/Pro分开发布

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

海军四川舰顺利完成首次航行试验

无障碍浏览 进入关怀版