python - 在创建新的transformdict时在参数dict上执行transform函数

时间:2017-07-09 11:01:14

标签: python dictionary

我已经读过这个很酷的新词典类型transformdict

我想在我的项目中使用它,通过使用常规字典初始化一个新的转换字典:

tran_d = TransformDict(str.lower, {'A':1, 'B':2})

成功,但当我运行时:

tran_d.keys()

我明白了:

['A', 'B']

在创建新的转换字典时,您如何建议在参数(常规)字典上执行转换函数? 为了清楚起见,我想要以下内容:

tran_d.keys() == ['a', 'b']

4 个答案:

答案 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。精简版是:

  1. 在使用前转换密钥的可读性较差。
  2. 它以奇怪的方式打破,有时甚至会发出错误的错误。
  3. 它引入了不必要的复杂性,因为使用普通的dicts避免了上述问题。

答案 3 :(得分:0)

除了@Ronan-Paixão答案

  1. TransformDict是一种超一般化,它是出于缺少案例折叠键而产生的,但是并未对现实世界中的用户可能需要进行概括的内容进行严格的研究---这意味着用户对它应该做什么的期望并未得到很好的考虑,如原始问题所示。
  2. 建议根据其他答案的建议,实现自己的字典子类,以适合自己的用例。

因此,与其说“不要使用TransformDict”,不如说是“自己构建,但给您的班级一个更好的描述性名称”,那么您将知道它的作用,将其隔离,而不鼓励仓库中有坏东西。

除了PEP 455之外,Hettinger的演示文稿也是一个很好的参考:http://il.pycon.org/2016/static/sessions/raymond-hettinger.pdf