# Python \`collections.ChainMap\` equivalent?

**URL:** <https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990>\
**Category:** Internals & Design\
**Tags:** data\
**Created:** [August 26, 2019, 8:36am UTC](https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990 "2019-08-26T08:36:30Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![singularitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/singularitti/32/17678_2.png) [@singularitti](https://discourse.julialang.org/u/singularitti)\
**Post date:** [August 26, 2019, 8:36am UTC](https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990/1 "2019-08-26T08:36:30Z")

</div>

Python’s [`collections.ChainMap`](https://docs.python.org/3.7/library/collections.html#collections.ChainMap) class groups multiple `dict`s or other mappings together to create a single, updateable view. So it is suitable to let user-specified command-line arguments take precedence over environment variables by `collections.ChainMap`:

```python
import builtins
pylookup = ChainMap(locals(), globals(), vars(builtins))

```

```python
import os, argparse

defaults = {'color': 'red', 'user': 'guest'}

parser = argparse.ArgumentParser()
parser.add_argument('-u', '--user')
parser.add_argument('-c', '--color')
namespace = parser.parse_args()
command_line_args = {k:v for k, v in vars(namespace).items() if v}

combined = ChainMap(command_line_args, os.environ, defaults)
print(combined['color'])
print(combined['user'])

```

Is there a Julia equivalent to `ChainMap`?

---

<div class="post-metadata">

**Author:** ![simeonschaub](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/simeonschaub/32/216566_2.png) [@simeonschaub](https://discourse.julialang.org/u/simeonschaub)\
**Post date:** [August 26, 2019, 11:49am UTC](https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990/2 "2019-08-26T11:49:55Z")

</div>

It looks like you’re looking for functionality to merge two `Dict`s. The most straight-forward way to do this is probably the `merge` function, which you can call on multiple `Dict`s. Note however, that this creates a whole new dictionary, which is slightly different to what python does, so depending on your use case, performance scaling might differ. If you want exactly the same behavior as the python version, this could probably also be implemented pretty easily

---

<div class="post-metadata">

**Author:** ![piever](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/piever/32/1815_2.png) [@piever](https://discourse.julialang.org/u/piever)\
**Post date:** [August 26, 2019, 12:36pm UTC](https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990/3 "2019-08-26T12:36:54Z")

</div>

> [@simeonschaub](#):
>
> Note however, that this creates a whole new dictionary

There also is a `merge!` function if you want to merge things in place.

---

<div class="post-metadata">

**Author:** ![tkf](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/tkf/32/17635_2.png) [@tkf](https://discourse.julialang.org/u/tkf)\
**Post date:** [August 26, 2019, 7:05pm UTC](https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990/4 "2019-08-26T19:05:20Z")

</div>

LayerDicts.jl seems to do the job if you only need read

[https://github.com/invenia/LayerDicts.jl](https://github.com/invenia/LayerDicts.jl)

---

<div class="post-metadata">

**Author:** ![singularitti](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/singularitti/32/17678_2.png) [@singularitti](https://discourse.julialang.org/u/singularitti)\
**Post date:** [August 27, 2019, 12:51am UTC](https://discourse.julialang.org/t/python-collections-chainmap-equivalent/27990/5 "2019-08-27T00:51:30Z")

</div>

Exactly what I want, thank you!
