В диктовке dicts, как вы эмулируете поведение Auto-vivification Perl?

Как Google, так и онлайн-документы не дают большого понимания моего запроса, поэтому я подумал, что я попрошу сообщество здесь.

В Perl вы можете легко настроить хеш-а-хеш-а-хэш и протестировать последний ключ следующим образом:

my $hash = {};
$hash{"element1"}{"sub1"}{"subsub1"} = "value1";
if (exists($hash{"element1"}{"sub1"}{"subsub1"})) {
   print "found value\n";
}

Какой эквивалент "лучшей практики" в Python?

Ответ 1

Ближайший эквивалент, вероятно, примерно такой:

import collections

def hasher():
  return collections.defaultdict(hasher)

hash = hasher()
hash['element1']['sub1']['subsub1'] = 'value1'
if 'subsub1' in hash['element1']['sub1']:
  print 'found value'

Ответ 2

Относительно того, является ли это наилучшей практикой в ​​Python, нужно обсудить:

hash = {}
hash['element1', 'sub1', 'subsub1'] = 'value'
if ('element1', 'sub1', 'subsub1') in hash:
    print "found value"

Но это, безусловно, работает и очень элегантно, если оно работает для вас.

Основной недостаток заключается в том, что у вас нет промежуточного доступа. Вы не можете:

if ('element1', 'sub1') in hash:
   print "found value"

Ответ 4

Я не знаю, соглашу ли я, но так я обычно декларирую словари словарей:

someObj = {
  'element1': {
    'sub1': {
      'subsub1': 'value1'
    }
  }
}

Что касается проверки наличия элемента, я согласен с этим подходом:

try:
  someObj['element1']['sub1']['subsub1']
except KeyError:
  print('no value found')
else:
  print('found value')