python与使用globals()的正向声明

python与使用globals()的正向声明,python,python-3.x,Python,Python 3.x,我有这样一个全球宣言: mydict = { "name1" : { "description" : "random text 1" , "function_name" : foo } } 这是模块中的全局函数,如果没有if\uuuuuu name\uuuuu==“\uuuuu main\uuuu”: 这意味着我需要在引用foo之前声明它——根据我的尝试。否则,当我运行代码时,我得到“foo”未定义 稍后在我的另一个函数中,我想做的是: def r

我有这样一个全球宣言:

mydict = {
   "name1" : {
       "description"   : "random text 1" ,
       "function_name" : foo
    }
}
这是模块中的全局函数,如果没有
if\uuuuuu name\uuuuu==“\uuuuu main\uuuu”:

这意味着我需要在引用foo之前声明它——根据我的尝试。否则,当我运行代码时,我得到
“foo”未定义

稍后在我的另一个函数中,我想做的是:

def randomCaller() :
   # ....
   mydict[ "name1" ][ "function_name"]()
由于我不想更改文件的结构,因此我可以选择使用名称并将上述代码更改为:

mydict = {
   "name1" : {
       "description"   : "random text 1" ,
       "function_name" : "foo"
    }
}
def randomCaller() :
   # ....
   fname = mydict[ "name1" ][ "function_name"]
   globals()[ fname ]()

上述方面是否存在任何问题/风险?你会提出不同的建议吗?

@MarkMeyer在评论中提出了一个很好的解决方法:

"function_name": lambda *args, **kwargs: foo(*args, **kwargs)
(参数可以是您需要的任何参数。这是最灵活的安排,但是如果您知道
foo()
将使用特定的参数集,您可以安排lambda来反映这一点)

通常,lambda的这种用法是非常无用的(“为什么不首先调用
foo
”)。然而,在这个特定的用例中,它非常有用,因为名称
foo
仅在调用lambda时计算,而不是在分配lambda时计算

换句话说,这在我的python控制台上起作用:

>>> f1 = lambda: foo()
>>> f1()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
NameError: name 'foo' is not defined
>>> def foo():
...     print("Hello World!")
...
>>> f1()
Hello World!

mydict[“name1”][“function_name”]()
有什么问题,在
randomCaller()内执行
global mydict
为什么需要函数的前向声明?我强烈建议在dict.python没有变量声明之前先声明fun。这在具有self.function的类中可以正常工作为什么不:
“function\u name”:lambda:foo()
mydict = {
    "name1" : {
       "description"   : "random text 1" ,
       "function_name" : None
    }
}
...
def foo():
    ...
mydict["name1"]["function_name"] = foo