python - 如何在 python 中创建我自己的映射类型

标签 python mapping

我创建了一个类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

但是,对于需要额外参数的函数,我不知道如何以优雅的方式完成它。典型的操作是将 foobar 集成为 x 值,例如 np.trapz(foo, x=bar),其中两者可以使用 MyClass.get(...) 检索 foobar

我正在朝这个方向思考:

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/

相关文章:

python - 在 Python 中如何使用与对象同名的字符串来访问对象本身?

python - Selenium webdriver 在超时后停止

python - 如何从派生类打印变量?

spring - 如何在 Spring MVC 和 Tomcat 中配置映射

sql - 使用映射表动态更改列名

python - Pandas 风格的每列都有不同的颜色

python - 是否可以将 spacy 与已经标记化的输入一起使用?

objective-c - RestKit:JSON 映射不起作用

R 从网格数据中提取点的类别

javascript - ReactJS 抛出 "map"未定义错误