标题有点奇怪,但我想不出更好的方式来表达它。我正在开发一个3D软件插件。它将数据存储在称为“通道”的东西中,而我正在处理的插件是基于某些数学关系同步不同的“通道”。基本上是这样的:
如果用户更新频道“质量”,我想根据公式更新“光线”和“比率”。如果他们更新“光线”或“比率”,我想更新“质量”。我需要更新一大堆不同的东西,而不仅仅是这些,但为了...简单,我会保持简单。
目前我有一本字典,这是一个要为每个频道更新频道的频道列表,如下所示:
channel_relationships = {
"quality": ["rays", "ratio"],
"rays": ["quality"],
"ratio": ["quality"]
}
这对于弄清楚正在发生什么变化很有用。我的代码获取一个发送给它的值,以通知它用户更改了哪个频道,所以我只需使用字典中的右键访问正确的列表:
channels_to_update = channel_relationships[incoming_channel]
for channel in channels_to_update:
UpdateChannel(channel)
这一切都很好,花花公子。但棘手的是,所有不同的渠道使用一些相当长的数学表达式以不同的方式影响彼此。目前我正在通过我的UpdateChannel函数中的一堆if / elif语句解决这个问题,如下所示:
def UpdateChannel(channel):
if channel == "rays":
pass #do math here
elif channel == "ratio":
pass #do other math...
elif channel == "quality"
pass #do other math...
哪个不是很优雅。理想情况下,我希望将函数本身以隐式方式存储在字典中,如下所示:
functions = {"quality": {"rays": 0.5*x**2+3.2*x+2,
"ratio": 7.3*x**2+1.2*x-5}}
基本上将函数本身直接存储在字典中。请注意,我宁愿不实际计算字典中的所有值。我希望它们只在需要时进行评估。因此,当我访问函数[“quality”] [“rays”]时,我想获得隐式函数,或者根据“x”计算得到的值。这样的事情。问题是,我不知道这在Python中是否可能可能,我也不知道从哪里开始寻找这样的东西。我可以为每个关系明确定义我的函数,但我最终会得到很多函数。因为所有函数实际上只是基于输入浮点值的单个浮点值,所以这似乎是最优雅的方式。
答案 0 :(得分:4)
函数是一流的对象,你可以将它们存储在字典中,检索它们,然后调用它们,没问题。
lambda
将从单个表达式生成函数:
functions = {
"quality": {
"rays": lambda x: 0.5*x**2+3.2*x+2,
"ratio": lambda x: 7.3*x**2+1.2*x-5
}
}
现在查看你的功能并打电话给他们:
functions['quality']['rays'](input_float_value)
是的,就这么简单。 : - )