2016-02-17 3 views
1

Мне трудно получить доступ к значениям в вложенном словаре, используя список ключей.Tcl: Как получить значение из вложенного словаря по списку ключей

dict set testDict library [dict create NY [dict create section [dict create adult [dict create book cinderella]]]] 
library {NY {section {adult {book cinderella}}}} 
# I can access the value by: 
dict get $testDict library NY section adult book 
cinderella 

# cannot access the same by list of keys in a variable 
set keyLst {library NY section adult book} 
library NY section adult book 
set keyStr "library NY section adult book" 
library NY section adult book 

dict get $testDict $keyLst 
key "library NY section adult book" not known in dictionary 
dict get $testDict $keyStr 
key "library NY section adults book" not known in dictionary 

# The only not elegant solution I came up is using eval + list 
eval dict get \$testDict $keyStr 
key "adults" not known in dictionary 

eval dict get \$testDict $keyLst 
cinderella 

В то время как eval работает в этом случае - должен быть лучший способ сделать это напрямую.

Любая идея, как получить доступ к значениям вложенного словаря по списку ключей в переменной?

+0

Если это всего лишь стиль кода, вы можете задать его на странице [Обзор кода] (http://codereview.stackexchange.com/). –

ответ

2

Вам необходимо развернуть список (или строку) в отдельные слова. dict не принимает в качестве аргумента list.

dict get $testDict {*}$keyLst 

Литература: dict; argument expansion

+0

Если бы мы сделали ключевые списки по умолчанию, работа с произвольными ключами стала бы сильно раздражающей и (следовательно, потому что лень) подвержена ошибкам. Это компромисс. –

+0

Большое спасибо за введение в расширение аргументов Tcl - это очень удобно. Я понимаю компромисс в дизайне Tcl - очень жаль, что книга B.Welsh Tcl предшествует словарям - я уверен, он бы ее покрыл. :-) –

Смежные вопросы