TypeError: eval() arg 1 must be a string, bytes or code object
TypeError: eval() arg 1 must be a string, bytes or code object
我正在尝试计算 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.它还可以评估已编译的代码对象,这就是错误消息比您预期的要复杂一些的原因,但请不要担心。
我正在尝试计算 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.它还可以评估已编译的代码对象,这就是错误消息比您预期的要复杂一些的原因,但请不要担心。