python - 在函数定义之前声明的函数字典
问题描述
我有以下代码:
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 (我想将全局变量保留在用户可访问的顶部),有没有办法解决这个问题?我不明白,当我调用函数时,它已经被声明了
解决方案
在解释第一行时,“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()
推荐阅读
- postgresql - AWS Aurora PostgreSQL - x509:由未知机构签署的证书
- javascript - Javascript - 如何将来自两个 API ajax 调用的数据传递给一个函数
- macos - 备份和同步 - 应用程序不打开。麦克莫哈韦
- java - 将 RecyclerView 重置为其初始 onCreate 状态
- java - 如何根据键获取 HashMap 值?
- domain-driven-design - 处理聚合之间的最终一致性失败
- r - 如何量化个体中的观察对
- c++ - 尝试使用 RtlInitUnicodeString() 时遇到链接器错误
- python - 将 Drake 用作 Bazel 外部时,PYTHONPATH 中出现意外路径
- spring-boot - Jhipster & Stripe 启动时间长