首页 > 解决方案 > 在函数定义之前声明的函数字典

问题描述

我有以下代码:

my_dict = {"function1" : function1, "function2" : function2}
def call_functions():
    for key in my_dict.keys():
        mydict[key]()

def function1():
    print "hello 1"

def function2():
    print "hello 2"

if __name__ == '__main__':
    call_functions()
    

我的理解是这应该有效 - 虽然在定义函数之前mydict声明,python 是基于名称调用它们,而不是基于指向函数的实际指针。由于在代码运行时它们确实存在(因为这是通过 main 发生的),所以应该没有问题。但是,我得到了可怕的 NameError - 告诉我 function1 不存在。

没有在文件末尾声明 my_dict (我想将全局变量保留在用户可访问的顶部),有没有办法解决这个问题?我不明白,当我调用函数时,它已经被声明了

标签: pythondictionary

解决方案


在解释第一行时,“function1”和“function2”变量被引用但尚未声明,因此程序崩溃,如您所见。

将函数声明移到 my_dict 行之前,它将起作用。你还有一个错字,我在这里更正了。(mydict vs my_dict)

def function1():
    print("hello 1")

def function2():
    print("hello 2")
    
my_dict = {"function1" : function1, "function2" : function2}
def call_functions():
    for key in my_dict.keys():
        my_dict[key]()

if __name__ == '__main__':
    call_functions()

编辑:正如@chepner 所建议的那样,除非有超出此上下文的内容可以提供充分的理由,否则在列表就足够的情况下,将函数保存在字典中是不必要的。请参见下面的示例。

def function1():
    print("hello 1")

def function2():
    print("hello 2")

my_list = {function1, function2}
def call_functions():
    for func in my_list:
        func()

if __name__ == '__main__':
    call_functions()

推荐阅读