繁体   English   中英

如何在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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM