0

我希望标题不会太错误或误导;我不完全确定这种东西的名称是什么。

基本上,我一直在使用字典(以及其中的一些子类:defaultdictOrderedDict,例如)做很多工作,并且正在尝试制作一些辅助函数,它们将为我完成一些提升工作,同时仍然在多个范围内操作不同类型的字典。理想情况下,我想快速(即进行一些优化)并且当然要优雅地做到这一点。这是我现在拥有的示例:

def filter_dict(old_dict, keep_keys): 
    return {k:v for k,v in old_dict.items() if k in keep_keys}

这很好用,但如果old_dict不是基本字典,我就会失去它。

好的,所以我可以做一些事情,比如type(old_dict)({.....})将新创建的字典包装在 old_dict 的类的构造函数中,但这仍然不适用于 defaultdicts,它将返回默认值的函数作为第一个参数。如果它是第二个参数,我可以将一些*args或一些东西传递给构造函数,但这会使事情复杂化。

我想我的问题是:我可以将部分应用程序应用于构造函数吗?我可以得到那个实例的胆量并调用它的类构造函数,除了items? 在 Haskell 中,我会做类似的事情,reverse = lambda f, x, *args: f(*args, x)但这在 Python 中甚至是不允许的。

我错过了什么?对课堂进行一些内省?修修补补__new__?工厂……什么或别的什么?我在这里感觉很愚蠢,试图得到一些漂亮但实用的东西(har)。

提前感谢您的任何见解。

4

1 回答 1

0

我会复制原始对象,然后更改副本。在您的示例中:

def filter_dict(old_dict, keep_keys): 
    res = old_dict.copy()
    for k in res.keys():
        if k not in keep_keys:
            res.pop(k)
    return res

听起来你的辅助函数只知道他们想要改变old_dict的东西,而不是他们想要保持不变的东西。因此,最安全的方法似乎是依赖copy方法(或copy模块),然后删除或更改您不想要的内容。否则,您需要某种方法来准确回忆用于创建对象的参数,并且我不知道是否存在执行此操作的通用方法。

于 2013-03-02T07:20:07.680 回答