You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

eval函数返回结果异常?命令行输入整数求和、字符串拼接需求问题

解决命令行参数整数求和/字符串拼接的eval问题

看起来你是想做一个脚本,能根据命令行传入的参数类型自动处理——传整数就求和,传字符串就拼接,但现在用eval的写法出问题了对吧?我来帮你理清楚问题所在,然后给你修复方案。

原代码的问题分析

你当前的代码有几个核心问题:

  • eval处理字符串的逻辑完全错误:命令行传入的字符串(比如你输入hello),eval(x)会把它当成变量名去查找,而不是作为字符串本身;就算你输入带引号的"hello",如果没定义过hello这个变量,直接就会报错,完全不是你想要的字符串拼接逻辑。
  • 初始值类型不匹配:你把b初始化成了整数0,如果后面遇到字符串,用+运算直接会抛出TypeError,因为整数和字符串不能相加。
  • 没有区分参数类型的逻辑:不管输入的是整数还是字符串,你都在做加法操作,这根本不符合你“整数求和、字符串拼接”的需求。

修复后的代码方案

这里我们不用eval(毕竟eval处理用户输入风险很高,还容易出逻辑问题),而是通过类型判断来分别处理:

from sys import argv

args = argv[1:]
# 先判断有没有传入参数
if not args:
    print("Oops! No arguments provided.")
    exit()

# 动态初始化结果变量,根据第一个参数的类型
try:
    # 尝试把第一个参数转为整数,成功则进入求和逻辑
    result = int(args[0])
    for arg in args[1:]:
        try:
            num = int(arg)
            result += num
        except ValueError:
            print(f"Error: '{arg}' is not an integer — can't add it to the sum!")
            exit()
    print(f'Entered integers sum is: {result}')
except ValueError:
    # 第一个参数是字符串,进入拼接逻辑
    result = args[0]
    for arg in args[1:]:
        result += arg
    print(f'Entered strings concatenated result is: {result}')

代码逻辑说明

  • 首先检查是否有命令行参数传入,没有的话友好提示并退出。
  • 先尝试将第一个参数转为整数:
    • 如果成功,说明我们要处理整数求和,后面每个参数都会尝试转成整数,遇到非整数就报错退出(你也可以根据需求改成跳过非整数,或者把非整数当成字符串处理,调整逻辑就行)。
    • 如果转换失败,说明我们要处理字符串拼接,直接把所有参数按字符串拼接起来。
  • 最后根据结果的类型输出对应的提示信息,清晰明了。

为什么不用eval?

eval会执行传入的任意代码,非常不安全——如果有人恶意传入类似__import__('os').system('rm -rf /')的参数,你的脚本会直接执行危险命令。而且它处理字符串的逻辑完全不符合你的需求,所以这里绝对不适合用eval。

内容的提问来源于stack exchange,提问作者surender pal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 06:18:14