gpt4 book ai didi

python - python 上的前向声明与使用 globals()

转载 作者:行者123 更新时间:2023-12-01 07:35:57 24 4
gpt4 key购买 nike

我有一个像这样的全局字典:

mydict = {
"name1" : {
"description" : "random text 1" ,
"function_name" : foo
}
}

这是模块中的全局函数,没有 if __name__ == "__main__":

这意味着我需要在引用 foo 之前声明它 - 根据我的尝试。否则,当我运行代码时,我会得到 'foo' is not Defined

后来在我的另一个功能中我想做的是:

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 来反射(reflect)它)。

通常,这种类型的 lambda 用法是非常无用的(“为什么不首先调用 foo 呢?”)。然而,在这个特定的用例中,它非常有用,因为名称 foo仅在调用 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!
<小时/>

也就是说,这个解决方案很hacky,并且可能与命名空间一起奇怪地发挥作用。处理该问题的最佳方法就是定义 foo()在定义 mydict 之前,但如果您绝对必须声明 mydict首先,您也可以简单地声明 "function_name": None最初,然后将其设置为 foo()定义 foo() 后:

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

关于python - python 上的前向声明与使用 globals(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56993673/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com