如何从列表中调用函数(如果存在)

时间:2019-06-08 20:02:05

标签: python

我有一个函数列表,如果该列表中存在该函数,则需要调用该函数。另外,我需要用字符串调用该函数。

我试图做这样的事情:

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,但是我不知道如何调用该函数。 另外,这不是重复的,因为我不会从类中调用该函数。

5 个答案:

答案 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))