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