FlatDict
FlatDict is a Python module for interacting with nested dictionaries as a single-level dictionary with delimited keys. It provides both `FlatDict` for general nested dictionaries and `FlatterDict` for dictionaries that may contain lists or tuples. The library is actively maintained with regular releases and is currently at version 4.1.0.
Warnings
- breaking Python 2 and Python 3.4 support was dropped in version 4.0.0. The minimum required Python version is now 3.10+.
- breaking Version 3.0.0 introduced significant changes to core behaviors: `FlatDict.as_dict()` now consistently returns a fully nested data structure, `dict(FlatDict())` yields a shallow dictionary with delimited keys, `FlatDict` extends `collections.MutableMapping` instead of `dict`, and `FlatDict.__eq__` was adjusted to compare only against `dict` instances or other `FlatDict` instances.
- deprecated The `__version__` attribute was removed in version 4.1.0. Attempting to access `flatdict.__version__` will result in an `AttributeError`.
- gotcha Modifying a `FlatDict` or `FlatterDict` instance (e.g., adding or deleting items) while actively iterating over its `iteritems()`, `iterkeys()`, or `itervalues()` methods can lead to `RuntimeError` or inconsistent iteration results. This is standard Python dictionary behavior for mutable iterators.
Install
-
pip install flatdict
Imports
- FlatDict
from flatdict import FlatDict
- FlatterDict
from flatdict import FlatterDict
- __version__
from importlib.metadata import version; version('flatdict')
Quickstart
import flatdict
import pprint
from importlib.metadata import version
# Get the library version (new way, as __version__ was removed in 4.1.0)
print(f"flatdict version: {version('flatdict')}")
# Example with FlatDict
nested_dict = {
'user': {
'name': 'Alice',
'contact': {'email': 'alice@example.com', 'phone': '123-456-7890'}
},
'app_settings': {'theme': 'dark'}
}
flat = flatdict.FlatDict(nested_dict)
print("\nFlatDict example:")
print(f"Original nested dict: {nested_dict}")
print(f"Flat dict representation: {flat}")
# Accessing values with delimited keys
print(f"Accessing 'user:name': {flat['user:name']}")
print(f"Accessing 'user:contact:email': {flat['user:contact:email']}")
# Modifying values
flat['app_settings:theme'] = 'light'
print(f"Modified 'app_settings:theme': {flat['app_settings:theme']}")
# Adding new values
flat['new:key'] = 'new_value'
print(f"Added 'new:key': {flat['new:key']}")
# Converting back to nested dict
print("\nConverted back to nested dict (FlatDict.as_dict()):")
pprint.pprint(flat.as_dict())
# Example with FlatterDict (handles lists/tuples by enumerating elements)
nested_with_list = {
'items': ['apple', 'banana', {'fruit': 'cherry'}],
'settings': {'verbose': True}
}
flatter = flatdict.FlatterDict(nested_with_list)
print("\nFlatterDict example:")
print(f"Original nested dict with list: {nested_with_list}")
print(f"Flatter dict representation: {flatter}")
# Accessing list elements using numerical keys
print(f"Accessing 'items:0': {flatter['items:0']}")
print(f"Accessing 'items:2:fruit': {flatter['items:2:fruit']}")
# Converting back to nested dict
print("\nConverted back to nested dict (FlatterDict.as_dict()):")
pprint.pprint(flatter.as_dict())