我希望能够在全球范围内订购字典.
我经常发现自己编写这样的代码:
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的命令,结果会很糟糕.
那么,有没有人知道这样做的方法?
你不能这样做,至少不是没有将源代码破解到你喜欢的Python实现并重建它.(而且,如果你最喜欢的实现是CPython,这将是一项大量的工作,因为OrderedDict它不仅不是内置的,它甚至没有C实现 - 尽管可能在3.5中有所改变.)
当然,您可以将名称重新绑定dict到collections.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)
| 归档时间: |
|
| 查看次数: |
66 次 |
| 最近记录: |