gpt4 book ai didi

python - 是否可以创建一个函数,该函数返回创建时生成的静态值,而不是调用该函数时生成的值?

转载 作者:行者123 更新时间:2023-12-04 09:29:31 26 4
gpt4 key购买 nike

问题陈述:
如何创建一个函数,该函数将传递一个在创建函数时确定的值,而不是在调用函数时?

背景
使用 altair 我正在尝试设置多个主题,为了创建一个主题,我需要"register"它的代码是这样的:

def black_marks():
return {
'config': {
'mark': {
'color': 'black',
'fill': 'black'
}
}
}

# register the custom theme under a chosen name
alt.themes.register('black_marks', black_marks)

# enable the newly registered theme
alt.themes.enable('black_marks')
此时,由于 'black_marks'已注册和启用,任何 future 使用 altair将包括这些默认值。
注意函数 black_marks返回 dict ,是需要注册的函数。

问题
我有几个我想一次设置的主题,所以我在我的代码中通过这些配置创建了一个循环:
for theme_name, theme_dict in mythemes.items():
themes.register(theme_name, lambda: theme_dict)
然后我发现主题是 当时实际上并未注册 themes.register正在调用函数 .相反,它被“懒惰地”处理。
例如,假设主题键是: ['light', 'dark', 'paper'] .完成上述循环后,我发现所有 3 个主题名称都已注册(例如,我可以 alt.themes.enable('light')),但是 他们都指向最后一个,paper .这是因为 theme_dict ,在最后一轮,确实指向了与 paper相关的主题。 .

欲望
我想做的是能够以某种方式“硬编码”什么 theme_dict指向,所以 themes.register指向一个函数,该函数包含在每次传递时生成的字典。但是无论我如何尝试考虑这一点,我都无法让 lambda 函数创建一个“一成不变”的函数。相反,该函数将只返回上次迭代中的任何内容。
所以,虽然这有点像 altair -特定问题,我觉得解决方案应该是通用的:
如何创建一个函数,该函数将传递一个在创建函数时确定的值,而不是在调用函数时?

富勒示例
根据评论中的要求,这是我的代码的更完整快照:
for theme_key, theme_file in THEME_FILES.items(): # THEME_FILES is a dictionary with values containing file paths
with open(theme_file) as theme_fh:
raw_theme = toml.load(theme_fh)
dims = {
"width": raw_theme.pop("width"),
"height": raw_theme.pop("height"),
}
raw_theme["view"] = dims
final_theme["config"] = raw_theme
themes.register(theme_key, lambda: final_theme)
(为糟糕的变量名道歉......我对我遇到的问题感到沮丧,重命名认为这个问题是对全局变量的意外覆盖。)
再次声明, theme_key正确注册。例如,如果不同的键是 ['light', 'dark', 'paper'] ,然后我可以看到所有 3 个。但所有三个都指向上次迭代制作的主题。在这种情况下, 'paper'主题。
如果我只是迭代 1 个主题,它工作得非常好。所以我相当有信心我已经查明了问题。

最佳答案

您可以使用工厂函数来生成返回主题字典的函数。字典将在返回函数的闭包中被捕获。

def factory(x):
def theme():
return x
return theme

for theme_name, theme_dict in mythemes.items():
themes.register(theme_name, factory(theme_dict))

关于python - 是否可以创建一个函数,该函数返回创建时生成的静态值,而不是调用该函数时生成的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62902646/

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