У меня есть часть PHP-кода, которую я пытаюсь передать на Python, и я не уверен, как работать без ссылок.Динамически редактировать дерево dict в Python
По существу это класс конфигурации, который работает как дерево, каждый ключ может иметь простое значение или собственный набор ключей и значений. Часть класса требует установки одной определенной части дерева без необходимости отправки всего нового dict для корневого ключа.
{ "caching": { "enabled": true }}
Например, приведенная выше может быть простой конфигурацией. И, подозвав ниже код изменится верно ложному
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, или я должен просто переписать свою логику с нуля и отказаться от идеального порта?
Что такое глобальное '_dmValues'? – Marcin
@Marcin это словарь, который является глобальным для модуля. Я исправил этот пример, спасибо, что указали его :) –