在Python中动态编辑dict树

2024-10-03 02:34:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一段PHP代码,我正在尝试移植到Python,我不知道如何在没有引用的情况下工作。你知道吗

本质上,它是一个像树一样工作的配置类,每个键可以有一个简单的值,或者它自己的一组键和值。类的一部分要求能够设置树的一个特定部分,而不必为根键发送整个新dict。你知道吗

{ "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中是可能的,还是我应该从头开始重新编写逻辑,放弃一个完美的端口?你知道吗


Tags: key代码falsetrueifvalueenableddict
2条回答

您可以按以下方式设置方法:

_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]]

相关问题 更多 >