[英]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.