builtins模块包含了Python大量的内置对象(函数、异常和类型等),她是Python的内置武器库,堪称功能完美的宝库。
笔记模板由python脚本于2025-03-19 08:16:27创建,本篇笔记适合喜欢探究python的coder翻阅。
博客的核心价值:在于输出思考与经验,而不仅仅是知识的简单复述。
Python官网:
这里,才 python 前沿。英文原版,原汁原味,才是寻根溯源的正统。
地址:https://www.python.org/
Free:
大咖免费“圣级”秘笈《 python 完全自学教程》不仅仅是基础那么简单……
地址:https://lqpybook.readthedocs.io/
自学并不是什么神秘的东西,一个人一辈子自学的时间,总是比在学校学习的时间长;没有老师的时候总是比有老师的时候多。
—— 华罗庚
本文质量分:
CSDN质量分查询入口:http://www.csdn.net/qc
“ b u i l t i n s builtins builtins ” —— Python的内置武器库
builtins
在不同语境下可能有不同的含义,具体取决于上下文。以下是常见的几种解释:
日常英语中的含义
编程中的 builtins(Python 专用)
builtins
是一个内置模块(Python 3 中为 builtins
,Python 2 中为 __builtin__
),包含所有无需导入即可直接使用的函数、异常和对象。print()
, len()
)。ValueError
, TypeError
)。int
, str
, list
)。# 直接使用内置函数
print("Hello") # 来自 builtins 模块
其他编程语言中的类似概念
Math
, Array
, JSON
)。printf()
, malloc()
)。cd
, echo
)。计算机科学中的广义概念
COUNT()
, SUM()
)。dir
,Linux 的 ls
)。命名演化史
builtins
的命名经历了有趣的演变:阶段 | 形态 | 意义隐喻 |
---|---|---|
动词 | build in | 功能嵌入的动作 |
形容词 | built-in | 已完成的内置状态 |
复数化 | built-ins | 多个内置功能的集合 |
代码实体 | builtins | Python3的模块命名 |
Python版本差异
__builtin__
(单数形式,魔法属性)builtins
(复数形式,显式模块)拼写变体
- 正确拼写: - Python 模块名:builtins
(Python 3)。 - 日常英语:通常写作 built-in
(带连字符,可作形容词或名词)。 在Python中,builtins
模块包含了所有内置的函数、异常和对象。这些内置功能在Python启动时自动加载,无需显式导入即可使用。
import builtins
# 查看所有内置成员
print([item for item in dir(builtins) if not item.startswith('__')])
典型输出(Python3.11):
['ArithmeticError', 'AssertionError', ..., 'zip']
包含157个可直接访问的内置成员(不同版本可能有差异)
类别 | 示例 | 作用域 |
---|---|---|
基础函数 | print() , len() , type() |
全局可用 |
异常体系 | Exception , ValueError |
异常处理基础 |
类型对象 | int , str , dict |
类型系统基石 |
常量 | True , False , None |
逻辑控制基础 |
以下是一些常见的builtins
模块中的内容:
print()
:打印输出。len()
:返回对象的长度。type()
:返回对象的类型。int()
, float()
, str()
, list()
, dict()
:类型转换函数。range()
:生成一个整数序列。sum()
:计算序列的和。min()
, max()
:返回序列中的最小值和最大值。abs()
:返回绝对值。round()
:四舍五入。Exception
:所有异常的基类。TypeError
:类型错误。ValueError
:值错误。IndexError
:索引错误。KeyError
:键错误。FileNotFoundError
:文件未找到错误。True
, False
:布尔值。None
:表示空值或无值。object
:所有类的基类。int
, float
, str
, list
, dict
:内置数据类型。用自定义对象,覆盖Python对象,是一个比较危险的操作,需谨慎!
# 重定义print函数(请勿在生产环境使用!)
builtins.print = lambda *args: os.system("say '喵喵喵~'")
print("Hello World") # 实际会执行系统命令播放猫叫
# 使用__builtins__副本保证安全
safe_builtins = {k: v for k, v in __builtins__.__dict__.items()
if k not in ('__import__', 'open')}
exec("print('安全操作')", {'__builtins__': safe_builtins}) # ✅ 允许
exec("open('test.txt')", {'__builtins__': safe_builtins}) # 触发NameError
“沙箱环境”代码解读
builtins
如同更改物理定律,可能导致灾难性后果
def is_builtin(obj):
return obj.__module__ == 'builtins'
print(is_builtin(print)) # True
try:
import builtins # Python3
except ImportError:
import __builtin__ as builtins # Python2
__builtins__
是CPython实现细节,不同环境下表现可能不同:
builtins
模块__main__
中:指向builtins.__dict__
我:
build in -> build in s -> built in s -> built-ins -> builtins
build in -> build in s -> built in s -> built-ins -> builtins
Python之builtins名称演化:内建、多个内建、已(build变过去分词形式)多个内建、组合单词、模块名称。
DeepSeek:
你的拆解非常有趣且富有创意! 我将结合 Python 的历史和语言演化,用「拟人化」的方式解释 builtins
的名称演变过程:
build in
(嵌入、内置)。built
(已构建的)built-in
(已内置的)。print()
),无需用户额外定义。built-in
,但语言有多个内置功能 → 加 s
表复数。built-ins
。builtins
。builtins
(Python 2 是 __builtin__
)。拟人化总结
builtins
的诞生过程:1️⃣ 最初它是一个动词(
build in
),描述「将功能嵌入语言」。
2️⃣ 后来它变成了形容词(built-in
),表示「已经嵌入的功能」。
3️⃣ 随着功能越来越多,它变成了复数(built-ins
),代表「一群内置工具」。
4️⃣ 最后为了适应代码世界的规则,它脱下连字符的外衣,变成模块名builtins
,成为 Python 的内置工具库管理员。
彩蛋
:Python 2 vs Python 3**
__builtin__
(单数,强调「单个内置空间」)。builtins
(复数,更符合实际——内置功能是多个的集合)。这种命名变化也体现了 Python 设计理念的演进:从「隐含的魔法」到「明确的表达」。✨
以下是代码的逐层解析:
# 创建安全的 builtins 副本(排除危险函数)
safe_builtins = {k: v for k, v in __builtins__.__dict__.items()
if k not in ('__import__', 'open')}
# 测试安全执行
exec("print('安全操作')", {'__builtins__': safe_builtins}) # ✅ 允许
exec("open('test.txt')", {'__builtins__': safe_builtins}) # 触发NameError
代码解析层级
安全沙箱原理
关键组件
组件 | 作用 |
---|---|
__builtins__ |
Python 内置模块的引用(在模块中指向 builtins 模块的字典形式) |
exec() |
动态执行字符串代码,可自定义全局命名空间 |
自定义命名空间 | 通过字典传递 {'__builtins__': safe_builtins} 限制可访问的内置函数 |
代码执行流程
# 原始内置函数字典 → 过滤后的安全字典
__builtins__.__dict__ → {'abs': <func>, ..., 'print': <func>} # 移除 __import__ 和 open
exec("print(...)", {'__builtins__': safe_builtins})
# 解释器查找 print 的顺序:
# 1. 当前代码的局部作用域 → 无
# 2. 自定义全局作用域的 __builtins__ → 找到 print
exec("open(...)", {'__builtins__': safe_builtins})
# 解释器查找 open 的顺序:
# 1. 当前代码的局部作用域 → 无
# 2. 自定义全局作用域的 __builtins__ → 无 open → 触发 NameError
第 4 层:技术细节
__builtins__
的双重身份
builtins
模块的字典形式(builtins.__dict__
)builtins
模块的引用(需通过 __builtins__.__dict__
访问字典)
exec(code, globals_dict, locals_dict)
globals_dict
包含 __builtins__
键,则使用该值作为内置模块__builtins__
open
和 __import__
,仍存在潜在风险:
# 仍可通过其他方式突破限制:
exec("os = (lambda: [].__class__.__base__.__subclasses__()[132]())()", safe_env)
exec("os.system('rm -rf /')", safe_env) # 通过回溯基类获取 os 模块
提示:要实现真正的安全沙箱,建议使用专用库(如
PySandbox
或RestrictedPython
)。
通过这种机制,可以实现基础级别的代码安全隔离。
上一篇:
Python的字符串优雅优化策略:特定编码 -> Unicode码点 -> UTF-8(可自定义)(Python利用唯一uni-pot中介打理,任意制式输出(首选uyf-8))
我的HOT博:
本次共计收集449篇博文笔记信息,总阅读量70.99w。数据采集于2025年03月17日 00:27:47,用时10分46.1秒。阅读量不小于6.00k的有 10 10 10篇。
截屏图片
精品文章:
好文力 荐:
CSDN实用技巧博文: