Python - eval 方法不需要除以零 [closed]

Python - eval method unwanted division by zero [closed]

提问人:shadow777 提问时间:11/18/2023 更新时间:11/18/2023 访问量:75

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

昨天关闭。

我想使用 Python 的 eval 函数来计算以下公式:

eval(nvl(a, b))

简而言之,我想检查两个单独的数学表达式,并在 0 的情况下选择第二个。a

nvl是我的自定义函数,如下所示:

def nvl(a, b):

    try:
        evaluated = eval(a)
    except:
        evaluated = 0

    if evaluated == 0:
        return eval(b)
    else:
        return evaluated

每当第一个表达式抛出异常时,我都会挣扎,例如,如果是,那么我的抛出异常而不是返回。a0/0eval(nvl(0/0, 1))1

有什么方法可以改变这种行为并迫使 eval 简单地执行我的方法而不是评估每个参数?

Python 评估

评论

3赞 Brian61354270 11/18/2023
你能澄清一下你认为是做什么的,是什么和是什么吗? 没有任何意义,因为不返回字符串。也没有.您是否试图将论点的评估推迟到?evalabeval(nvl(a, b))nvleval(nvl(0/0, 1))nvl
0赞 pho 11/18/2023
我投票将其作为拼写错误关闭,因为您的函数需要字符串,但您尝试将表达式 for 和 for 的结果传递给它。你需要,不是nvl0/0a1bnvl("0/0", "1")nvl(0/0, 1)
0赞 shadow777 11/18/2023
好的,现在有意义了,谢谢你强调这一点
2赞 Ignatius Reilly 11/18/2023
在你深入研究这个问题之前,我建议你对与两者相关的问题/不良做法做一些研究,并包罗万象。evalexcept

答:

-1赞 GaTe 11/18/2023 #1

它甚至没有达到你的尝试,除非你的除法在函数的参数中

尽你所能,除非你在哪里做你的部门。因此,你必须给你的函数这样的商

def nvl(a, b):
    ...
    return evaluated

def yourDivision(a,b):
    return a/b

try:
    a = yourDivision(x, y)
    evaluated = nvl(a, b)
except ZeroDivisionError:
    evaluated = 0
0赞 Suramuthu R 11/18/2023 #2

我假设 a 是表达式 1,b 是表达式 2。而且每个表达式中几乎没有其他变量

我的建议是:将表达式 1 拆分为分子和分母。例如,如果表达式 1 为 2x/y+6,则可以按如下方式声明:

Nr = 2*x
Dr = y+6

如果表达式 1 仍然很复杂,例如 (2x/(y+4)) + (3x/(y-5)),即使这样,您也可以按如下方式拆分:

Nr = (2*x*(y-5)) + (3*x*(y+4))
Dr = (y+4)*(y-5)

现在,您可以将条件声明为:

if Nr == 0 or Dr == 0: return eval(b)