簡體   English   中英

在Python中動態編輯字典樹

[英]Dynamically edit dict tree in Python

我有一段PHP代碼正在嘗試移植到Python,我不確定如何在沒有引用的情況下工作。

本質上,它是一個像樹一樣工作的配置類,每個鍵可以有一個簡單的值,或者是它自己的一組鍵和值。 類的一部分要求能夠設置樹的一個特定部分,而不必發送用於根密鑰的整個新字典。

{ "caching": { "enabled": true }}

例如,以上可能是簡單的配置。 並調用以下代碼會將true更改為false

Config.set('caching:enabled', false);

為了在PHP中完成此操作,我使用了引用

class Config
{
    private static $aValues;

    public static function set($key, $value)
    {
        if(strpos($key, ':')) {
            $aKeys  = explode(':', $key);
            $iCount = count($aKeys);
        } else {
            $aKeys  = array($key);
            $iCount = 1
        }

        $mData  = &self::$aValues
        for($i = 0; $i < $iCount; ++$i)
        {
            if(!isset($mData[$aKeys[$i])) {
                $mData[$aKeys[$i]]  = array();
            }

            $mData  = &$mData[$aKeys[$i]];

            if($i == ($iCount - 1)) {
                $mData  = $value;
            }
        }
    }
}

但是如果我嘗試在Python中做類似的事情

_dmValues = dict()

def set(key, value):
    global _dmValues

    if key.find(':'):
        aKey    = key.split(':')
        iCount  = len(key)
    else:
        aKey    = (key,)
        iCount  = 1

    mData   = _dmValues;
    for i in range(0, iCount):
        if key[i] not in mData.keys():
            mData[key[i]]   = dict()

        mData   = mData[key[i]]

        if i == (iCount - 1):
            mData   = value

它不起作用,mData是正確的值,但是由於我已經寫了它,因此它不再是引用。

我該怎么做呢? 在Python中甚至可能,還是我應該從頭開始重寫邏輯並放棄一個完美的端口?

您可以如下設置set方法:

_dmValues = { "caching": { "enabled": True }}

def set(key, value):
    global _dmValues

    key1,key2    = key.split(':')    

    mData   = _dmValues;

    if key1 in mData:
        if key2 in mData[key1]:
            mData[key1][key2] = value


set('caching:enabled', False)

print(_dmValues)  # {'caching': {'enabled': False}}    

雖然可能最好刪除全局值並將引用傳遞給dict作為參數:

def set(mData, key, value):       
    key1,key2    = key.split(':')           
    if key1 in mData:
        if key2 in mData[key1]:
            mData[key1][key2] = value


set(_dmValues, 'caching:enabled', False)

print(_dmValues) # {'caching': {'enabled': False}}   

我更多地嘗試了它,並意識到我有解決方案,只是我沒有正確地應用它。

每個字典,即使它是另一個字典的鍵的一部分,也可以通過引用傳遞。 這意味着,如果我更改該詞典中的鍵,其父級中的鍵也將更改。 不幸的是,我更改了引用字典的變量,而不是字典本身。

這完美地工作

mData = _dm_Values
for i in range(0, iCount):
    if i == (iCount - 1):
        mData[key[i]] = value
    else:
        if key[i] not in mData.keys():
            mData[key[i]] = dict()
        mData = mData[key[i]]

暫無
暫無

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

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