我已经读过这个很酷的新词典类型transformdict
我想在我的项目中使用它,通过使用常规字典初始化一个新的转换字典:
tran_d = TransformDict(str.lower, {'A':1, 'B':2})
成功,但当我运行时:
tran_d.keys()
我明白了:
['A', 'B']
在创建新的转换字典时,您如何建议在参数(常规)字典上执行转换函数? 为了清楚起见,我想要以下内容:
tran_d.keys() == ['a', 'b']
答案 0 :(得分:3)
我已经在评论中说过了,但重要的是要意识到这不是TransformDict
的意思。因此,您可以使用keys
的自定义实现对其进行子类化:
class MyTransformDict(TransformDict):
def keys(self):
return map(self.transform_func, super().keys())
根据您的Python版本,您可能需要在list()
(Python 3)周围使用map
或为super
提供参数:super(TransformDict, self)
(Python 2)。但它应该说明原则。
正如@Rawing在评论中指出的那样,会有更多方法无法按预期工作,即__iter__
,items
,可能还有__repr__
。
答案 1 :(得分:2)
根据我看到的实现,转换函数可以通过名为transform_func
的属性来实现,所以
list(map(tran_d.transform_func, tran_d.keys()))
应该这样做。
答案 2 :(得分:0)
我不打算使用TransformDict。它被建议为PEP 455并且被拒绝。这意味着它不会成为内置功能,因此您必须自己手动实现它或使用某个库来执行它。
可以找到关于PEP的BDFL代表的结论here。精简版是:
答案 3 :(得分:0)
除了@Ronan-Paixão答案
因此,与其说“不要使用TransformDict”,不如说是“自己构建,但给您的班级一个更好的描述性名称”,那么您将知道它的作用,将其隔离,而不鼓励仓库中有坏东西。
除了PEP 455之外,Hettinger的演示文稿也是一个很好的参考:http://il.pycon.org/2016/static/sessions/raymond-hettinger.pdf