繁体   English   中英

你能调用/使用从 Python 列表返回的函数吗?

[英]Can you call/use a function returned from a list in Python?

我试图将一个函数存储在一个列表中,稍后从列表中检索该函数,然后调用该函数。 这基本上就是我想要做的,没有任何细节。 它没有显示我的目的,但这是同一个问题。

elements: list = [] # List meant to contain a tuple with the name of the item and the function of the item.
def quit_code():
    exit()
element.append(("quit", quit_code))

现在,在代码的其他地方,我希望能够使用 if 语句来检查项目的名称,如果当时是正确的名称,则运行该函数。

user_input = "quit" # For brevity, I'm just writing this. Let's just imagine the user actually typed this.
if elements[0][0] == user_input:
    #This is the part I don't understand so I'm just going to make up some syntax.
    run_method(elements[0][1])

我随意制作的方法run_method是问题所在。 我需要一种方法来运行由elements[0][1] 返回的方法,即quit_code 方法。 我不需要这个例子的替代解决方案,因为我只是为了显示我想要做的事情而编造的。 如果我有一个包含函数的函数或对象,我该如何运行该函数。

(以我能说的最简单的方式)如果我有包含 str_1 和 fun_b 的 object_a(对我来说它是一个元组),我如何从对象运行 fun_b

为了进一步扩展,我不能直接调用该函数的原因是因为在我的程序中,该函数通过用户输入放入元组中,并在本地创建,然后存储在元组中。

__list_of_stuff: list = []    
def add_to_list(name, function):
    __list_of_stuff.append((name, function))

然后在别的地方

def example_init_method():
    def stop_code():
        exit()

    add_to_list("QUIT", stop_code())

现在请注意,除非我通过__list_of_stuff 对象使用它,否则我无法在代码中的任何其他地方访问 stop_code 方法。

最后,不必为输入创建函数会很好。 在这里,我的意思是直接将代码插入参数而不创建像 stop_code 这样的本地函数。 我不知道如何做到这一点。

Python 将函数视为一等公民。 因此,您可以执行以下操作:

def some_function():
    # do something
    pass

x = some_function

x()

由于您正在存储函数并将每个函数与一个单词(键)绑定,因此最好的方法是字典。 你的例子可能是这样的:

def quit_code():
    exit()

operations = dict(quit=quit_code)

operations['quit']()

字典将值与键相关联。 唯一的规则是密钥必须是不可变的。 这意味着数字、字符串、元组和其他不可变对象。

要创建字典,您可以使用 { 和 }。 要通过其键获取值,请使用 [ 和 ]:

 my_dictionary = { 'a' : 1, 'b' : 10 }

 print(my_dictionary['a'])    # It will print 1

您还可以使用dict创建字典,如下所示:

 my_dictionary = dict(a=1, b=10)

然而,这只适用于字符串键。

但是考虑到你是用quit_code来封装exit调用,为什么不直接用exit呢?

 operations = dict(quit=exit)

 operations['quit']()

如果字典不是一个选项,您仍然可以使用列表和元组:

 operations = [('quit',exit)]

 for key, fun in operations:
     if key == 'quit':
         fun()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM