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

时间:2018-07-26 19:08:50

标签: 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,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()是不好的做法。那有什么好办法吗?谢谢。

1 个答案:

答案 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。它还可以评估编译后的代码对象,这就是为什么错误消息比您预期的要复杂一些,但是不必担心。