类型错误:eval()arg 1必须是字符串、字节或代码对象

2024-10-01 17:24:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着在x0计算一个函数

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

我试过了:

^{pr2}$

但这会带来一个回溯:

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()是一种不好的做法。那有什么好办法呢?谢谢。在


Tags: lambda函数ininputipythonevallinefile
1条回答
网友
1楼 · 发布于 2024-10-01 17:24:22

^{}函数将对字符串进行计算,就好像它是源代码一样。1例如,eval("f(*args)")将执行与直接调用f(*args)相同的操作。在

但是你没有源代码,你有一个函数。要调用函数,只需:

return f(*args)

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


但实际上,根本不需要这个函数。而不是这样:

^{pr2}$

…你可以直接叫它:

f(x0)

您需要像您的feval这样的东西的唯一原因是,如果其他人已经分别向您传递了一个函数和一组参数,而您需要将它们组合到一个函数调用中。Python以前有一个函数,^{},但它很早以前就被删除了,因为它几乎从来没有必要,如果有必要则使用一行代码。在


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

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

  • 如果字符串来自源代码,则可能不需要eval,只需运行代码即可。所以你不想在这里用它。在
  • 另一方面,如果字符串来自用户输入或互联网或其他东西,它可能是危险的,比如"__import__('os').system('mr -rf /')"只是一个输入错误,就不会是一个非常糟糕的想法。在

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

相关问题 更多 >

    热门问题