2016-11-27 3 views
0

Как я могу создать переменные из ключей и значений словаря? Возможно ли следующее извлечение (например, PHP)?ключи экспорта и значения словаря как имя переменной и значение

julia> d = Dict(
    "key1" =>111, 
    "key2" =>222, 
    "key3" =>333 
); 
julia> extract(d) 
julia> key1, key2, key3 
(111,222,333) 
+2

Посмотрите на пакет mauro3 Parameters.jl (https://github.com/mauro3/Parameters.jl). В частности, распаковка Dict - это способ описания этой операции. –

ответ

1

можно ввести новые переменные в глобальной рамки с eval:

julia> x = 1 
1 

julia> function testeval() 
      eval(:(x = 5)) 
      return x 
     end 
testeval (generic function with 1 method) 

julia> testeval() 
5 

julia> x # the global x has changed! 
5 

extract функция может выглядеть следующим образом:

julia> function extract(d) 
      expr = quote end 
      for (k, v) in d 
       push!(expr.args, :($(Symbol(k)) = $v)) 
      end 
      eval(expr) 
      return 
     end 

julia> extract(d) 

julia> key1, key2, key3 
(111,222,333) 

Обратите внимание, что каждый модуль имеет свой собственный глобальный охват. Следовательно, это будет вводить переменные в объем модуля, где определена функция extract, то есть в модуль Main, если он определен в REPL, как в примере.

Вы должны быть очень осторожны при использовании eval и сначала рассмотреть другие подходы, например, упомянутые Дэвидом П. Сандерсом и Дэном Гетцем.

+0

Это здорово! Спасибо за ваше предупреждение! В настоящее время я использую это только для создания глобальных констант из json-файла в начале программы, и ваша функция подходит для этой цели. Я изменил ваш на '' 'push! (Expr.args,: (const $ (Symbol (k)) = $ v))' ''. Тогда я получу '' 'WARNING: переопределить константу key1''', если я изменю его значение. – Phuoc

2
k = collect(keys(d)) 

v = collect(values(d)) 

Оба ключа и значения возвращают итераторы. collect затем создает массив.

Но обратите внимание, что вы часто не нужно делать это и может просто перебирать словарь, используя

for (k, v) in d 
Смежные вопросы