Python TypeError:eval()arg 1必须是字符串、字节或代码对象

Python TypeError:eval()arg 1必须是字符串、字节或代码对象,python,eval,Python,Eval,我试图在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

我试图在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
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
费瓦尔(f,x0)
文件“”,第2行,在二月
返回值(f)(*args)
TypeError:eval()arg 1必须是字符串、字节或代码对象
我还读到使用eval()是一种糟糕的做法。那么,做这件事的好方法是什么?谢谢

函数将字符串作为源代码进行求值。1例如,
eval(“f(*args)”)
将执行与直接调用
f(*args)
相同的操作

但是你没有源代码,你有一个函数。要调用函数,只需执行以下操作:

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


但实际上,根本不需要这个函数。与此相反:

feval(f, x0)
…你可以直接打电话给它:

f(x0)
您需要像您的
feval
这样的东西的唯一原因是,如果其他人分别向您传递了一个函数和一组参数,您需要将它们组合到一个函数调用中。Python过去有一个函数来实现这一点,但它在很久以前就被删除了,因为它几乎从来都不是必需的,如果有必要的话,还可以使用一行程序


我还读到使用eval()是一种糟糕的做法

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

  • 如果字符串来自源代码,则可能不需要
    eval
    ,只需运行代码即可。这就是为什么你不想在这里使用它
  • 另一方面,如果字符串来自用户输入、互联网或其他东西,它可能是危险的,比如
    “\uuuuu import\uuuuuuu('os')。system('mr-rf/')”
    仅仅是一个打字错误,还不算是一个非常糟糕的评估方法


一,。它还可以计算编译后的代码对象,这就是为什么错误消息比您预期的要复杂一些,但不要担心这一点。

如果您想调用函数,只需调用它:
return f(*args)
。事实上,您刚刚复制了一个功能较弱的古代函数版本,它在Python 2.3中被弃用,在3.0中被删除,因为它实际上没有用处。您可以调用
f(x0)
而不是
feval(f,x0)
eval
仅用于将字符串转换为python表达式。例如,
eval('f(*args)
f(*args)
相同,但在这种情况下使用前者毫无意义。我从未想过我必须为“如何调用函数?”这个问题搜索重复项……@Aran Fey我找不到。有一些关于
apply
的问题是相关的,但我认为解释它们为什么与OP相关需要大量的写作和直接回答。希望你能找到更好的?