python 3 删除 input() 是为消除 python 2 中 input() 隐式调用 eval() 导致的任意代码执行风险,改用安全的 raw_input() 行为并强制显式类型转换。

Python 3 删除 raw_input() 不是因为“功能冗余”或“懒得维护”,而是为了消除一个危险且易被误用的接口——input() 在 Python 2 中会隐式调用 eval(),直接执行用户输入的任意代码。
Python 2 的 input() 实际上是 eval(raw_input())
这意味着:当你在 Python 2 中写 age = input("How old? ") 并输入 25,它能工作;但如果你输入 __import__('os').system('rm -rf /')(在有权限的系统上),程序就真的会执行这条命令。这不是理论风险,而是真实发生过的安全漏洞源头。
- Python 2 的
input()等价于eval(raw_input()),无任何沙箱、无警告、无过滤 -
raw_input()才是安全的、只返回字符串的“真正输入函数” - 绝大多数实际场景(表单、配置、菜单选择)根本不需要表达式求值,却因命名模糊导致新手误用
input()
Python 3 的 input() 就是 Python 2 的 raw_input()
重命名不是为了“简化 API”,而是强制开发者面对类型转换这件事:你必须显式决定“这串文本我要当什么用”。
仅使用 Python 将 Claw Code 虚拟化框架与 OpenClaw 集成,提供 184 种工具和 200 多条命令,用于安全分析和代码质量...
- 所有输入都返回
str,包括"42"、"3.14"、"True"、"[1,2,3]" - 想转数字?得自己写
int(input("x: "))或float(input("y: ")) - 想解析布尔值或列表?不能靠
input()自动猜,得用ast.literal_eval()或手动逻辑 - 如果硬要复刻 Python 2 的
input()行为,得显式写eval(input(...))—— 至少你得打完eval这三个字母,心里会停顿一下
常见错误:以为 input() 能自动识别数字类型
这是从 Python 2 迁移过来最典型的认知残留。现象是:程序看似运行,但后续计算报 TypeError: unsupported operand type(s) for +: 'str' and 'int'。
- 错误写法:
x = input("Enter number: "); result = x + 10→TypeError - 正确做法:
x = int(input("Enter number: ")); result = x + 10 - 更健壮写法:加
try/except捕获ValueError,因为用户可能输"abc" - 别用
eval()替代类型转换——它不解决输入校验,反而引入执行风险
真正容易被忽略的点不是“怎么转类型”,而是:当你的程序要处理用户输入的复杂结构(比如 JSON 片段、带空格的路径、含引号的句子)时,input() 返回的原始字符串里可能藏着换行、制表符或 Unicode BOM。这时候 strip() 不够用,得考虑 sys.stdin.readline().rstrip('\n\r') 或编码清理逻辑。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










