如何在Python中的全局变量中引用尚未声明的函数?

时间:2015-04-16 15:12:36

标签: python reference global-variables variable-declaration function-declaration

我需要一个全局字典,字符串作为键,函数引用作为值。我不想写类似于交换机的东西,因为我需要能够从另一个脚本中获取密钥列表。我试着编写一个看起来像这样的脚本:

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'未定义”。我能想到的唯一两个解决方案是:

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

  • 声明一个hackish函数“get_global_variable”,它创建并返回完全相同的dict。它正在发挥作用,但它非常难看。

有没有办法做一些懒惰的声明和/或什么是更加pythonic的方法来解决这种情况?

3 个答案:

答案 0 :(得分:3)

Pythonic方法是在函数之后声明变量,而不管它是如何出现的。不要担心,其他人会完全理解为什么要这样做。

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

答案 1 :(得分:2)

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

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>

答案 2 :(得分:0)

我讨厌这个,但它会“奏效”。

而不是文字变量,每个函数的名称都放在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 ...>