gpt4 book ai didi

python - 类型错误 : eval() arg 1 must be a string, 字节或代码对象

转载 作者:行者123 更新时间:2023-12-04 15:56:14 28 4
gpt4 key购买 nike

我正在尝试评估 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() 是不好的做法。那有什么好办法呢?谢谢。

最佳答案

eval 函数将字符串作为源代码求值。1 例如,eval("f(*args)")会做与调用 f(*args) 相同的事情直接地。

但是你没有源代码,你有一个函数。要调用一个函数,你所要做的就是:

return f(*args)

获取函数作为参数并不重要, f , 而不是直接来自 def声明或 lambda表达。函数值只是对象,就像 Python 中的其他任何东西一样,您可以像传递任何其他值一样传递它们,然后随时调用它们。

但实际上,根本不需要这个功能。取而代之的是:
feval(f, x0)

……你可以直接调用它:
f(x0)

您需要像 feval 这样的东西的唯一原因是如果其他人分别向您传递了一个函数和一堆参数,并且您需要将它们放在一起进行函数调用。 Python 曾经有一个函数, apply ,但它很久以前就被删除了,因为它几乎从来没有必要,如果有必要的话,它是单行的。

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



它通常是。那是因为它将字符串视为代码:
  • 如果字符串来自您的源代码,您可能不需要 eval并且可以运行代码。这就是为什么你不想在这里使用它。
  • 另一方面,如果字符串来自用户输入或互联网或其他东西,它可能是危险的——比如 "__import__('os').system('mr -rf /')"距离成为一个非常糟糕的评估想法只有一个错字。


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

    关于python - 类型错误 : eval() arg 1 must be a string, 字节或代码对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51545986/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com