我正在尝试评估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()是不好的做法。那有什么好办法吗?谢谢。
答案 0 :(得分:2)
eval
函数将字符串视为源代码来进行评估。 1 例如,eval("f(*args)")
的作用与直接调用f(*args)
相同。
但是您没有源代码,但是有一个功能。要调用一个函数,您要做的就是:
return f(*args)
将函数用作参数f
而不是直接从def
语句或lambda
表达式中获取都没关系。函数值只是对象,就像Python中的其他任何对象一样,您可以将它们与其他任何值一样传递,然后在需要时调用它们。
但实际上,根本不需要此功能。代替这个:
feval(f, x0)
...您可以直接调用它:
f(x0)
您需要feval
之类的东西的唯一原因是,如果其他人分别向您传递了一个函数和一堆参数,则需要将它们组合在一起进行函数调用。 Python曾经为此提供一个功能,apply
,但很久以前就删除了它,因为它几乎从不需要,如果需要的话,可以使用单行代码。
我还读到使用eval()是不好的做法。
通常是。那是因为这是关于将字符串视为代码:
eval
,而只需运行代码即可。这就是为什么您不想在这里使用它。"__import__('os').system('mr -rf /')"
这样的错别字就是一个很难评估的主意。1。它还可以评估编译后的代码对象,这就是为什么错误消息比您预期的要复杂一些,但是不必担心。