Python TypeError:eval()arg 1必须是字符串、字节或代码对象
我试图在x0处计算一个函数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
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相关需要大量的写作和直接回答。希望你能找到更好的?