Python 使有序dict成为默认值?

Python 使有序dict成为默认值?,python,dictionary,literals,ordereddictionary,Python,Dictionary,Literals,Ordereddictionary,是否可以将默认的dict文本设置为创建有序的dict而不是无序的dict 我想键入复杂的嵌套配置,如: config = { 'train': { 'speed': 0.001, 'initial_values': [1, 2, 3] }, 'model': { ... } } 还有写一堆括号的想法 config = OrderedDict([( 'train', OrderedDict([( 'speed', 0.00

是否可以将默认的dict文本设置为创建有序的dict而不是无序的dict

我想键入复杂的嵌套配置,如:

config = {
   'train': {
       'speed': 0.001,
       'initial_values': [1, 2, 3]
   },
   'model': {
...
   }
}
还有写一堆括号的想法

config = OrderedDict([(
    'train', OrderedDict([(
       'speed', 0.001), (
       'initial_values', [1, 2, 3])]),(
    'model', OrderedDict([(
...
这是绝对不可复制的

请不要用哲学来解释为什么我的愿望不好


好的,现在我会写一些东西,比如:

def od(*args):
   return OrderedDict([(args[i], args[i+1]) for i in range(0, len(args), 2)])

config = od(
    'train', od(
        'speed', 0.001,
        'initial_values', [1, 2, 3]
     ),
     'model', od(
    ...
     )
)

不,如果不修改CPython源代码并重新编译,就不能修改Python语法,但这样它就不再是Python了

最好是升级到Python 3.6或更新版本,其中包含字典。如果您必须拥有完整的
OrderedDict
功能集(重新排序、反转、带顺序的dict视图),则在以下事实之后将这些常规词典转换为
OrderedDict
对象:

from collections import OrderedDict
from functools import singledispatch

@singledispatch
def to_ordered_dict(d):
    """Convert dictionaries to OrderedDict objects, recursively

    Assumes you want to use current dictionary iteration order; in Python 3.7
    and newer that's the same as insertion order (or earlier if on PyPy, or 
    when using CPython, 3.6 and newer).

    """
    return d

@to_ordered_dict.register(dict)
def _dict(d):
    return OrderedDict(
        (to_ordered_dict(k), to_ordered_dict(v))
        for k, v in d.items()
    )

@to_ordered_dict.register(list)
@to_ordered_dict.register(tuple)
def _sequence(s):
    return type(s)(map(to_ordered_dict, s))

# add additional type registrations for other compound or container types

然后继续使用
{…}
符号,并在末尾使用
config=to_ordered\u dict(config)
行。

没有哲学上的理由不应该这样做,但您可能无法通过更改基本Python语法来做到这一点。正如其他地方提到的,Python字典可以在3.6之后保留顺序,但如果必须使用
orderedict

d = OrderedDict

config = d([(...)])

您也可以使用类似
.update

这样的方法,尽管这并不能直接回答您的问题,但我想您确实希望能够处理一些配置。我通常不喜欢将配置保存在python文件中,而是以某种结构化数据格式保存。因此,如果您可以承认使用了json,那么您可以执行以下操作

from collections import OrderedDict
import json

result = json.loads(
'''
    {
       "train": {
           "speed": 0.001,
           "initial_values": [1, 2, 3]
       },
       "model": {
            "name": "model_name",
            "wheight" : 128000
       }
    }
''', 
object_pairs_hook=lambda pairs: OrderedDict(pairs))
即使在Python2.7中也应该可以这样做

如果您有一个专门的配置文件,那么您可以执行以下操作

from collections import OrderedDict
import json

with open('settings.conf', 'r') as f:
    settings_str = f.read()
    settings = json.loads(settings_str, object_pairs_hook=lambda pairs: OrderedDict(pairs))

简言之,没有。。。但是请阅读3.6+的功能以及注意事项和更多细节。使用Python 3.6+“绝对不可复制…”为什么?@RoadRunner对许多样板代码来说这并不意味着
class OrderedDict(dict):
在3.6+中实际上已经过时了吗?它仍然在@usr2564301中:不,它没有
OrderedDict
提供的功能不仅仅是记住插入顺序。明白了!最后一段,“因为它提供了一些额外的功能”,在你提到的答案中,即使只有一个字母别名,你也不能避免为每个键值对使用一个列表和元组