lections.ChainMap
](https://docs.python.org/3/library/collections.html#chainmap-objects) , a
handy class that can transparently group multiple dicts together. We just need
to pass it all our settings layers (higher-priority ones first), and ChainMap
takes care of the rest:

    
    
    >>> from collections import ChainMap
    >>> settings = ChainMap(cmd_args, config_file, env_vars, defaults)
    >>> settings['items_per_page']
    100
    >>> env_vars['items_per_page'] = 25
    >>> settings['items_per_page']
    25  # yup, automatically propagated
    

Pretty handy, isn’t it?

* * *

  1. In case you spot a mis-indented ` else ` block – the indentation is actually correct. It’s a for-else statement, and the ` else ` block only gets executed if the loop finishes normally, i.e. without ` break ` -ing out of it.  ↩ 
  2. There is also a [ polyfill ](https://pypi.python.org/pypi/chainmap) for (some) older Python versions.  ↩ 

###  Share this:

  * [ Twitter  ](https://blog.peterlamut.com/2017/11/27/handling-application-settings-hierarchy-more-easily-with-pythons-chainmap/?share=twitter "Click to share on Twitter")
  * [ Facebook  ](https://blog.peterlamut.com/2017/11/27/handling-application-settings-hierarchy-more-easily-with-pythons-chainmap/?share=facebook "Click to share on Facebook")
  * 

Like  Loading...

![](https://1.gravatar.com/avatar/47889a61e55c396e2ea18b0de05fa8a63f36cf32eddcf552613be0ebca37fb83?s=49&d=identicon&r=G)
Author  [ Peter Lamut ](https://blog.peterlamut.com/author/peterlamut/) Posted
on  [ November 27, 2017  ](https://blog.peterlamut.com/2017/11/27/handling-
application-settings-hierarchy-more-easily-with-pythons-chainmap/) Tags  [
ChainMap ](https://blog.peterlamut.com/tag/chainmap/) , [ Python
](https://blog.peterlamut.com/tag/python/) [ Leave a comment  on Handling
application settings hierarchy more easily with Python’s ChainMap
](https://blog.peterlamut.com/2017/11/27/handling-application-settings-
hierarchy-more-easily-with-pythons-chainmap/#respond)

##  About the Author

![](https://1.gravatar.com/avatar/47889a61e55c396e2ea18b0de05fa8a63f36cf32eddcf552613be0ebca37fb83?s=96&d=identicon&r=G)  
I am an experienced software engineer, primarily using Python and JavaScript
in my day-to-day work, putting a strong emphasis on writing clean and
maintainable code.

I use Linux, like to crack jokes, and enjoy attending developer meetups and
conferences like EuroPython.

I do not own any pets or hair care products.

Search for:  Search

##  Tags

  * [ Attribute lookup ](https://blog.peterlamut.com/tag/attribute-lookup/)
  * [ ChainMap ](https://blog.peterlamut.com/tag/chainmap/)
  * [ Classmethod ](https://blog.peterlamut.com/tag/classmethod/)
  * [ CPython internals ](https://blog.peterlamut.com/tag/cpython-internals/)
  * [ Debugging ](https://blog.peterlamut.com/tag/debugging/)
  * [ Decorators ](https://blog.peterlamut.com/tag/decorators/)
  * [ Descriptors ](https://blog.peterlamut.com/tag/descriptors/)
  * [ Dictionary ](https://blog.peterlamut.com/tag/dictionary/)
  * [ Enum ](https://blog.peterlamut.com/tag/enum/)
  * [ Function arguments ](https://blog.peterlamut.com/tag/function-arguments/)
  * [ General ](https://blog.peterlamut.com/tag/general/)
  * [ Metaclasses ](https://blog.peterlamut.com/tag/metaclasses/)
  * [ Python ](https://blog.peterlamut.com/tag/python/)
  * [ remote work ](https://blog.peterlamut.com/tag/remote-work/)
  * [ Sentinel ](https://blog.peterlamut.com/tag/sentinel/)
  * [ Sequences ](https://blog.peterlamut.com/tag/sequences/)
  * [ Slices ](https://blog.peterlamut.com/tag/slices/)
  * [ SQLAlchemy ](https://blog.peterlamut.com/tag/sqlalchemy/)

##  Archives

  * [ April 2020 ](https://blog.peterlamut.com/2020/04/)
  * [ June 2019 ](https://blog.peterlamut.com/2019/06/)
  * [ February 2019 ](https://blog.peterlamut.com/2019/02/)
  * [ November 2018 ](https://blog.peterlamut.com/2018/11/)
  * [ May 2018 ](https://blog.peterlamut.com/2018/05/)
  * [ February 2018 ](https://b