簡體   English   中英

將命令字典設為默認?

[英]Make ordered dict default?

是否可以使用默認字典文字來創建有序字典而不是無序字典?

我想輸入復雜的嵌套配置,例如:

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(
    ...
     )
)

不,您不能更改Python語法,不能不更改CPython源代碼並重新編譯,但是那樣就不再是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_dict(config)行。

出於哲學上的原因,您不應該這樣做,但是您可能無法通過更改基本的Python語法來做到這一點。 如其他地方所述,Python字典可以在3.6之后保留順序,但是如果必須使用OrderedDict

d = OrderedDict

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

您可以使用.update方法執行相同.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))

即使在python 2.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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM