Python 如何将字符串转换为函数调用?
我有一个变量,它调用字符串格式的函数。例如Python 如何将字符串转换为函数调用?,python,python-3.x,Python,Python 3.x,我有一个变量,它调用字符串格式的函数。例如 val = "add(3,4)" 功能是 def add(a,b): sum =a+b; print(sum) 这是从文件接收的,因此无法更改。是否有一种方法可以将字符串转换为可以调用函数的格式?i、 e add(3,4) 它将运行add(3,4)函数 我尝试使用globals: s= globals()['add'] s() 但我无法传递参数添加(3,4)。有谁能帮我传递参数吗?你可以使用eval def add(a,b
val = "add(3,4)"
功能是
def add(a,b):
sum =a+b;
print(sum)
这是从文件接收的,因此无法更改。是否有一种方法可以将字符串转换为可以调用函数的格式?i、 e
add(3,4)
它将运行add(3,4)
函数
我尝试使用globals
:
s= globals()['add']
s()
但我无法传递参数
添加(3,4)
。有谁能帮我传递参数吗?你可以使用eval
def add(a,b):
return a+b
eval('add(3,4)') # 7
您可以使用:
如果函数参数由文字组成,则可以使用
ast.literal\u eval
对其进行解析:
import ast
func, args = val[:-1].split('(', 1)
globals()[func](*ast.literal_eval(args))
为了更好地控制用户可以触发哪些函数,最好将它们放在单独的字典中:
functions = {'add': add}
...
functions[func](*ast.literal_eval(args))
否则,可以使用全局名称空间中的任何函数。正如其他人提到的,使用是不好的做法,您的设计可能需要进行一些调整 但是,如果在实际执行
eval()
函数之前执行检查,则可以为代码增加一点安全性:
def add(a,b):
return a + b
func = "add(3,4)"
# Check if the calling function exists in `locals()` dictionary.
if func.split('(', maxsplit=1)[0] in locals():
print(eval(func)) # Prints 7
为什么不能传递参数
s(3,4)
?您也可以这样做python-c'导入文件;print(file.add(3,4))”
Wait,那么您的变量不是函数的名称,而是一个表达式,其中包含使用某些特定参数调用的函数?你为什么这么做?你应该认真地重新考虑这个方法。我不能把论点和函数分开。你为什么这么做?最后,您可以使用eval
或exec
,但是您应该认真地重新考虑整个方法,因为函数名存储在变量var
中,这需要eval(f'{var}(3,4)
但这是危险的,因为var
可以包含的不仅仅是“add”
@a_guest显然,从文件中读取的不仅仅是名字,而是一个完整的调用。是的,我不确定到底是什么情况,但我从文件中读取字符串“add(3,4)”。这基本上没有增加任何安全性。它只能防止namererror
试图调用不存在的函数;它不能防止eval
所能做的任何实际危险的事情。
def add(a,b):
return a + b
func = "add(3,4)"
# Check if the calling function exists in `locals()` dictionary.
if func.split('(', maxsplit=1)[0] in locals():
print(eval(func)) # Prints 7