我创建了一个类MyClass
,其中包含大量模拟数据。该类对具有相似结构的不同模拟的模拟结果进行分组。可以使用 MyClass.get(foo)
方法检索结果。它返回一个包含模拟 ID/数组对的字典,数组是每个模拟的 foo 值。
现在我想在我的类中实现一个方法,将任何函数应用于 foo
的所有数组。它应该返回一个带有simulationID/function(foo)对的字典。
对于不需要额外参数的函数,我发现以下解决方案非常令人满意(欢迎评论:-)):
def apply(self, function, variable):
result={}
for k,v in self.get(variable).items():
result[k] = function(v)
return result
但是,对于需要额外参数的函数,我不知道如何以优雅的方式完成它。典型的操作是将 foo
与 bar
集成为 x 值,例如 np.trapz(foo, x=bar)
,其中两者可以使用 MyClass.get(...)
检索 foo
和 bar
我正在朝这个方向思考:
def apply(self, function_call):
"""
function_call should be a string with the complete expression to evaluate
eg: MyClass.apply('np.trapz(QHeat, time)')
"""
result={}
for SID in self.simulations:
result[SID] = eval(function_call, locals=...)
return result
问题是我不知道如何传递本地映射对象。或者也许我看错了方向。预先感谢您的帮助。
罗尔
最佳答案
你有两种方法。第一个是使用functools.partial :
foo = self.get('foo')
bar = self.get('bar')
callable = functools.partial(func, foo, x=bar)
self.apply(callable, variable)
虽然第二种方法是使用与partial相同的技术,但您可以定义一个接受任意参数列表的函数:
def apply(self, function, variable, *args, **kwds):
result={}
for k,v in self.get(variable).items():
result[k] = function(v, *args, **kwds)
return result
请注意,在这两种情况下,函数签名都保持不变。我不知道我会选择哪个,也许是第一种情况,但我不知道你正在处理的背景。
关于python - 如何在 python 中创建我自己的映射类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10538130/