# How to generate variables and assign values from a dictionary by metapgramming?

**URL:** https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638
**Category:** General Usage
**Tags:** metaprogramming
**Created:** [April 15, 2020, 1:33pm UTC](https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638 "2020-04-15T13:33:55Z")
**Posts on this page:** 5
**Page:** 1

<div class="post-metadata">

### Author: ![Xing\_Shi\_Cai](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/xing_shi_cai/32/14128_2.png) [@Xing\_Shi\_Cai](https://discourse.julialang.org/u/Xing_Shi_Cai)
#### Post date: [April 15, 2020, 1:33pm UTC](https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638/1 "2020-04-15T13:33:55Z")

</div>

I am using `ArgParse.jl` to parse command line arguments. It returns a dictionary. But I would prefer to generate variables so it’s easier to use them. I tried to use Meta programming as follows

```julia
function main()
    parsed_args = parse_commandline()

    # Turn the dictionary into variables
    for key in keys(parsed_args)
        ex = Meta.parse("const $key = parsed_args[\"$key\"]")
        eval(ex)
    end
    do_something(n1, n2, d1, d2)
end

```

But I got

```julia
ERROR: LoadError: UndefVarError: parsed_args not defined

```

What did I do wrong?

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [April 15, 2020, 1:43pm UTC](https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638/2 "2020-04-15T13:43:36Z")

</div>

> [@Xing\_Shi\_Cai](#):
>
> What did I do wrong?

`eval` evaluates in global scope. `parsed_args` is in local scope.

---

<div class="post-metadata">

### Author: ![Xing\_Shi\_Cai](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/xing_shi_cai/32/14128_2.png) [@Xing\_Shi\_Cai](https://discourse.julialang.org/u/Xing_Shi_Cai)
#### Post date: [April 15, 2020, 1:45pm UTC](https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638/3 "2020-04-15T13:45:36Z")

</div>

@kristoffer.carlsson Anyway to fix this?

---

<div class="post-metadata">

### Author: ![stevengj](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/stevengj/32/71_2.png) [@stevengj](https://discourse.julialang.org/u/stevengj)
#### Post date: [April 15, 2020, 1:54pm UTC](https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638/4 "2020-04-15T13:54:59Z")

</div>

> [@Xing\_Shi\_Cai](#):
>
> ex = Meta.parse(“const $key = parsed\_args["$key"]”) eval(ex)

You probably want `eval(:(const $(Symbol(key)) = $(parsed_args[key])))`. (Note that I’m inserting the _value_ of `parsed_args[key]` directly into the expression tree.) In general, it is _vastly_ more flexible and reliable to build expression trees directly rather than parsing strings.

---

<div class="post-metadata">

### Author: ![kristoffer.carlsson](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/kristoffer.carlsson/32/22_2.png) [@kristoffer.carlsson](https://discourse.julialang.org/u/kristoffer.carlsson)
#### Post date: [April 15, 2020, 2:10pm UTC](https://discourse.julialang.org/t/how-to-generate-variables-and-assign-values-from-a-dictionary-by-metapgramming/37638/5 "2020-04-15T14:10:31Z")

</div>

> [@Xing\_Shi\_Cai](#):
>
> Anyway to fix this?

Yes, interpolate the values into the expression.
