如何在 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: name 'func_1' is not defined”。我能想到的唯一两个解决方案是:
在文件的末尾声明全局变量,但是如果我必须编辑它真的很烦人,我宁愿这个信息尽可能靠近文件的顶部.
声明一个骇人听闻的函数 "get_global_variable",它(创建和)return 完全相同的字典。它可以工作,但它很难看。
有没有办法做一些惰性声明and/or解决这种情况的更 pythonic 方法是什么?
Pythonic 方式是在函数之后声明变量,不管它看起来如何。别担心,其他人会非常理解为什么这样做。
或者,如果您确实确实需要在模块中的函数之前出现变量,请将函数移至单独的模块中,然后导入它们。杀无赦...
我讨厌这个,但它 "work"。
代替文字变量,每个函数的名称放在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 ...>
定义一个装饰器,在您定义函数时将函数引用添加到字典中。
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 = {'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: name 'func_1' is not defined”。我能想到的唯一两个解决方案是:
在文件的末尾声明全局变量,但是如果我必须编辑它真的很烦人,我宁愿这个信息尽可能靠近文件的顶部.
声明一个骇人听闻的函数 "get_global_variable",它(创建和)return 完全相同的字典。它可以工作,但它很难看。
有没有办法做一些惰性声明and/or解决这种情况的更 pythonic 方法是什么?
Pythonic 方式是在函数之后声明变量,不管它看起来如何。别担心,其他人会非常理解为什么这样做。
或者,如果您确实确实需要在模块中的函数之前出现变量,请将函数移至单独的模块中,然后导入它们。杀无赦...
我讨厌这个,但它 "work"。
代替文字变量,每个函数的名称放在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 ...>
定义一个装饰器,在您定义函数时将函数引用添加到字典中。
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>