我希望标题不是太错误或误导;我不完全确定这个名字是什么名字。
基本上,我一直在用词典(以及它的一些子类,例如defaultdict
和OrderedDict
)做很多工作,并且我试图做一些辅助函数,它们会做这对我来说有些提升,同时仍然可以操作多种不同类型的字典。理想情况下,我想快速做到这一点(也就是说,通过一些优化),当然还有优雅。这是我现在拥有的一个例子:
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__
?工厂......还有什么东西?我觉得这里真的很蠢,试图得到一些漂亮但功能强大的东西。
提前感谢任何见解。
答案 0 :(得分: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
模块),然后删除或更改您不想要的内容。否则,您需要某种方式来准确回忆用于创建对象的参数,并且我不知道是否存在执行此操作的常规方法。