Python eval计算器拦截字母输入功能失效问题求解
问题根因
你调用__contains__时传参存在语法错误:Python中多个相邻无分隔符的字符串会自动拼接为一个完整字符串,你代码里所有用引号包裹的单字符最终会被合并为一长串连续字符,判断逻辑变成了「检查输入是否包含这一整串超长的连续字符」,几乎不可能匹配成功,因此始终触发else分支。
修复代码
推荐使用白名单校验逻辑,仅允许计算器必要的字符存在,比黑名单漏判风险更低:
# 白名单:仅允许数字、四则运算符、括号、小数点、空格 allow_chars = set("0123456789+-*/(). ") if any(c not in allow_chars for c in calc): print("Test - 包含非法字符") else: print("Answer: " + str(eval(calc)))
如果需要沿用黑名单校验的思路,可修改为如下写法:
import string # 黑名单包含所有大小写字母和指定特殊符号 illegal_chars = set(string.ascii_letters + r'!#$%&\'()",.:;<>?@[]^_`{|}~') if any(c in illegal_chars for c in calc): print("Test - 包含非法字符") else: print("Answer: " + str(eval(calc)))
注意事项
eval直接执行用户输入存在极高安全风险,用户可构造恶意代码执行任意系统操作,作业场景可通过严格的白名单校验降低风险,正式生产环境禁止直接使用eval处理用户输入。
内容的提问来源于stack exchange,提问作者BigEzra
相关产品推荐
相关产品推荐

