如何在 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'"。我能想到的仅有的两个解决方案是:

  • 在文件末尾声明全局变量,但是如果我必须编辑它,那真的很烦人,我宁愿将此信息尽可能靠近文件顶部。

  • 声明一个 hackish 函数"get_global_variable",它(创建并)返回完全相同的字典。它正在工作,但它非常丑陋。

有没有办法做一些懒惰的声明和/或解决这种情况的更python的方法?

Pythonic 的方式是在函数之后声明变量,无论它看起来如何。别担心,其他人会完全理解为什么要这样做。

或者,如果您确实需要在模块中的函数之前显示变量,请将函数移动到单独的模块中,然后导入它们。没有杀戮像矫枉过正...

定义一个修饰器,该修饰器在定义函数时将函数引用添加到字典中。

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 ...>

相关内容

  • 没有找到相关文章

最新更新