全局制作有序的Python词典

Pet*_*ter 1 python

我希望能够在全球范围内订购字典.

我经常发现自己编写这样的代码:

things_to_evaluate = {
    'thing 1': lambda: Thing(property = 'a'), 
    'thing 2': lambda: Thing(property = 'b'), 
    ...
    }

...

for k, v in things_to_evaluate.iteritems():
     thing = v()
     result[k] = thing.process(something)
Run Code Online (Sandbox Code Playgroud)

在我的例子中,字典语法是指定我想尝试的一堆实验的便捷方式.现在,我想实际按照我指定的顺序显示结果.

我知道这是一件可怕的事情,我知道散列和无序集合以及OrderedDict和一切的存在.

尽管如此,如果我可以选择仅仅为了我自己的方便,使用一行代码,覆盖一些原始函数并使其成为所有dicts的命令,结果会很糟糕.

那么,有没有人知道这样做的方法?

aba*_*ert 5

你不能这样做,至少不是没有将源代码破解到你喜欢的Python实现并重建它.(而且,如果你最喜欢的实现是CPython,这将是一项大量的工作,因为OrderedDict它不仅不是内置的,它甚至没有C实现 - 尽管可能在3.5中有所改变.)

当然,您可以将名称重新绑定dictcollections.OrderedDict全局(在您的模块中)或超全局(在内置)内,但这不会影响文字字典显示,字典理解,返回字典的内置代码(包括像type构造类和对象的函数以及__dict__处理的解释器代码**kwargs等等.

可以创建自己的编写OrderedDict显示和理解的方法,并使用带有AST转换器的导入钩子将它们转换为对OrderedDict构造函数的调用.我相信OrderedDict显示器是附带的样本之一MacroPy,并且扩展它以处理理解也不应该太难.但是没有这样的东西,你要做的最好的事情是:

from collections import OrderedDict as o

things_to_evaluate = o(
    ('thing 1', lambda: Thing(property = 'a')), 
    ('thing 2', lambda: Thing(property = 'b')), 
    ...
    )
Run Code Online (Sandbox Code Playgroud)

… 要么:

def o(*args):
    return OrderedDict(zip(args[::2], args[1::2]))

things_to_evaluate = o(
    'thing 1', lambda: Thing(property = 'a'),
    'thing 2', lambda: Thing(property = 'b'),
    ...
    )
Run Code Online (Sandbox Code Playgroud)