![](/img/trans.png)
[英]How to properly reference a global variable in nested functions in Python
[英]How to reference not-yet-declared functions in a global variable in Python?
我需要一个全局字典,字符串作为键,函数引用作为值。 我不想编写类似于开关的内容,因为我需要能够从另一个脚本中获取键列表。 我试图写一个像这样的脚本:
GLOBAL_VARIABLE = {'id_1' : func_1,
'id_2' : func_2,
'id_3' : func_3
}
def get_id_list():
return GLOBAL_VARIABLE.keys()
def func_1(arg):
<do some stuff>
def func_2(arg):
<do some stuff>
def func_3(arg):
<do some stuff>
但是,当我这样做时,Python会向我抛出错误“ NameError:未定义名称'func_1' ”。 我能想到的仅有的两种解决方案是:
在文件末尾声明全局变量,但是如果我必须对其进行编辑,那确实很烦人,我希望此信息离文件顶部尽可能近。
声明一个黑名单函数“ get_global_variable”,该函数(创建并)返回完全相同的字典。 它正在工作,但是非常难看。
有没有办法做一些懒惰的声明和/或有什么更Python的方式来解决这种情况?
Python的方式是在函数后声明变量,而不管其外观如何。 不用担心,其他人会完全理解为什么这样做。
或者,如果确实需要在模块中的函数之前显示变量,请将这些函数移至单独的模块中,然后将其导入。 没有杀戮般的杀伤力...
定义装饰器,以在定义函数时将函数引用添加到字典中。
GLOBAL_VARIABLE = {}
def export(tag):
def _(f):
GLOBAL_VARIABLE[tag] = f
return f
return _
@export('id_1')
def func_1(arg):
<do some stuff>
@export('id_2')
def func_2(arg):
<do some stuff>
@export('id_3')
def func_3(arg):
<do some stuff>
我讨厌这个,但是会“起作用”。
每个函数的名称都放在GLOBAL_VARIABLE
,而不是文字变量。
>>> GLOBAL_VARIABLE = {
... "id_1": "func_1",
... "id_2": "func_2",
... "id_3": "func_3",
... }
这些函数的定义与之前相同。
>>> def func_1():
... return 1
...
>>> def func_2():
... return 2
...
>>> def func_3():
... return 3
...
在函数定义之后,将在GLOBAL_VARIABLE
中查找函数名称以查找实际函数。 这些将替换名称。
>>> GLOBAL_VARIABLE = {key: globals()[value] for (key, value) in GLOBAL_VARIABLE
.items()}
>>> GLOBAL_VARIABLE["id_1"]
<function func_1 at ...>
>>> GLOBAL_VARIABLE["id_2"]
<function func_2 at ...>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.