如何在 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”。我能想到的唯一两个解决方案是:

有没有办法做一些惰性声明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>