Python 使有序dict成为默认值?
是否可以将默认的dict文本设置为创建有序的dict而不是无序的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
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
提供的功能不仅仅是记住插入顺序。明白了!最后一段,“因为它提供了一些额外的功能”,在你提到的答案中,即使只有一个字母别名,你也不能避免为每个键值对使用一个列表和元组