我有一个函数列表,如果该列表中存在该函数,则需要调用该函数。另外,我需要用字符串调用该函数。
我试图做这样的事情:
if "func1" in funcs:
funcs.__getitem__("func1")
但是我做错了
funcs = [func1, func2, func3]
def func1: return 1
def func2: return 2
def func3: return 3
if "func1" in funcs:
# call func1 since it exists
我希望输出为1
,但是我不知道如何调用该函数。
另外,这不是重复的,因为我不会从类中调用该函数。
答案 0 :(得分:3)
发现我将只使用字典。容易得多。
funcs = {"func1": func1, etc..}
def func1(): return 1
def etc..
if "func1" in funcs:
funcs["funcs1"]()
答案 1 :(得分:0)
您还可以使用类结构和检查模块,它们可能会提供更多的灵活性:
import inspect
class funcs:
def func1(): return 1
def func2(): return 2
def func3(): return 3
listfuncs = inspect.getmembers(funcs, lambda a:inspect.isfunction(a))
print(listfuncs)
listfuncs将是具有函数名称和对象引用的元组列表。
答案 2 :(得分:0)
即兴创作@ Gwang-Jin Kim已经提供的答案。
如果这样做,会发生什么?
def func1():
return 1
def func2():
return 2
tuple_list = [("func1",func1), ("func2", func2)]
if any([items[0] == "func1" for items in tuple_list]):
print("Do Something")
或这个
for key, val in tuple_list:
if key == "func1":
print(val())
而且,这似乎是一个重复的问题call list of function using list comprehension
答案 3 :(得分:0)
Gwang-Jin Kim正确地解释了Python。因此,需要在调用函数之前对其进行定义。现在,您需要在用户键入该函数的名称时调用该函数。可以使用eval()函数运行用户键入的文本。但是,不建议这样做,因为不能确定用户将输入什么,这可能会导致不必要的错误。
相反,我建议您使用命令系统,在其中基于预定义的名称调用函数,如下所示:
def func1():
print(1)
def func2():
print(2)
while True:
try:
msg = input('Which function would you like to call?: ')
if not msg:
break
if msg.startswith('func1'):
func1()
if msg.startswith('func2'):
func2()
except Exception as e:
print(e)
break
答案 4 :(得分:-3)
def func1(): return 1
def func2(): return 2
def func3(): return 3
funcs = [func1, func2, func3]
funcs_dict = {f.__name__: f for f in funcs}
funcname = "func1"
funcs_dict[funcname]()
这将检查-函数名是否在funcs
中的函数名下面,然后执行它!
(可以在Python中使用字典来避免if-checking。)
如果没有像funcs
这样的列表,则必须使用globals()
来完成:
if callable(globals()[funcname]):
print(globals()[funcname]())
if callable(eval(funcname)):
print(eval(funcname)())
或:
try:
print(eval(funcname)())
except:
print("No such functionname: {}".format(funcname))
或:
try:
globals()[funcname]()
except:
print("No such functionname: {}".format(funcname))