TypeError: eval() arg 1 must be a string, bytes or code object

TypeError: eval() arg 1 must be a string, bytes or code object

我正在尝试计算 x0 处的函数

f = lambda x:mu*div2d(grad2d(x))+x-b

我试过这个:

def feval(f, *args):
    return eval(f)(*args)
feval(f,x0)

但它抛出了回溯:

Traceback (most recent call last):

  File "<ipython-input-128-6be96feb06d6>", line 1, in <module>
    feval(f,x0)

  File "<ipython-input-126-67b053764219>", line 2, in feval
    return eval(f)(*args)

TypeError: eval() arg 1 must be a string, bytes or code object

我还了解到使用 eval() 是一种不好的做法。那么这样做的好方法是什么?谢谢。

eval 函数将字符串作为源代码进行计算。1 例如,eval("f(*args)") 与调用 f(*args)直接。

但是你没有源代码,你有函数。要调用一个函数,您所要做的就是:

return f(*args)

将函数作为参数 f 而不是直接从 def 语句或 lambda 表达式获取并不重要。函数值只是对象,就像 Python 中的任何其他内容一样,您可以像传递任何其他值一样传递它们,然后在需要时调用它们。


但实际上,根本不需要这个功能。而不是这个:

feval(f, x0)

……直接调用即可:

f(x0)

您需要像您的 feval 这样的东西的唯一原因是,如果其他人分别向您传递了一个函数和一堆参数,而您需要将它们组合到一个函数调用中。 Python 曾经有一个用于此的功能,apply,但很久以前就被删除了,因为它几乎从来没有必要,如果有必要的话,一个单行。


I also read that using eval() is bad practice.

通常是这样。那是因为它是关于将字符串视为代码:

  • 如果字符串来自您的源代码,您可能不需要 eval 并且可以 运行 代码。这就是为什么你不想在这里使用它。
  • 另一方面,如果字符串来自用户输入或互联网或其他东西,它可能很危险——像 "__import__('os').system('mr -rf /')" 这样的东西只是一个打字错误,就不是一个非常糟糕的评估主意。

1.它还可以评估已编译的代码对象,这就是错误消息比您预期的要复杂一些的原因,但请不要担心。