Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将字符串转换为函数调用?_Python_Python 3.x - Fatal编程技术网

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