NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
PyPI · #1868 most downloaded on PyPI
Advanced Python dictionaries with dot notation access
Last release 7 months ago
21 Feb 2026
Release timing varies
gaps range from 2 weeks to 1.1 years
Nearly every release is documented
notes for 53 of 53 stable releases
Nothing withdrawn
no release was ever pulled
10 years old
66 releases · first in 2017
Fixing #303 Wrong version number (7.3.3) in 7.4.0 release (thanks to Michał Górny)
Mistakenly released 7.4.0 as 7.3.3 in PyPI, same as above
Mistakenly released 7.4.0 as 7.3.3 in PyPI, same as above
One column per quarter.
Fixing #288 default get value error when using box_dots (thanks to Sébastien Weber)
Fixing #275 default_box_create_on_get is ignored with from_yaml (thanks to Ward Loos)
Adding tests and Cython releases for Python 3.13
Adding #266 support for accessing nested items in BoxList using numpy-style tuple indexing (thanks to Bit0r)
__repr__ methods so that subclassing will output the correct class name (thanks to Gabriel Tkacz)Fixing Cython optimized build deployments for linux
Fixing Cython optimized build deployments for linux
Adding #255 defer ipython import for large import speed improvements (thanks to Eric Prestat)
Adding #255 defer ipython import for large import speed improvements (thanks to Eric Prestat)
Adding testing for Python 3.12
Fixing #253 merge_update box list merge types not populated to sub dictionaries (thanks to lei wang)
Fixing #257 Two test failures due to arguments having incorrect types (thanks to Michał Górny)
Fixing stub files to match latest code signatures
Removing #251 support for circular references in lists (thanks to d00m514y3r)
Removing support for Python 3.7 as it is EOL
Switching off of poetry due to multiple build issues
Adding #169 default functions with the box_instance and key parameter (thanks to Коптев Роман Викторович)
| and + for frozen boxes (thanks to Peter B)| and + updates were performed for right operations (thanks to aviveh21)Adding #169 default functions with the box_instance and key parameter (thanks to Коптев Роман Викторович)
Adding #170 Be able to initialize with a flattened dict - by using DDBox (thanks to Ash A.)
Adding #192 box_dots treats all keys with periods in them as separate keys (thanks to Rexbard)
Adding #211 support for properties and setters in subclasses (thanks to Serge Lu and David Aronchick)
Adding #226 namespace to track changes to the box (thanks to Jacob Hayes)
Adding #236 iPython detection to prevent adding attribute lookup words (thanks to Nishikant Parmar)
Adding #238 allow | and + for frozen boxes (thanks to Peter B)
Adding new DDBox class (Default Dots Box) that is a subclass of SBox
Adding #242 more Cython builds using cibuildwheel (thanks to Jacob Hayes)
Fixing #235 how | and + updates were performed for right operations (thanks to aviveh21)
Fixing #234 typos (thanks to Martin Schorfmann)
Fixing no implicit optionals with type hinting
Removing Cython builds for mac until we can build universal2 wheels for arm M1 macs
Nothing published for this version
Nothing published for this version
Adding #242 more Cython builds using cibuildwheel (thanks to Jacob Hayes)
Removing Cython builds for mac until we can build universal2 wheels for arm M1 macs
Adding #169 default functions with the box_instance and key parameter (thanks to Коптев Роман Викторович)
| and + for frozen boxes (thanks to Peter B)| and + updates were performed for right operations (thanks to aviveh21)Changing the deprecated toml package with modern tomllib, tomli and tomli-w usage (thanks to Michał Górny)
toml package with modern tomllib, tomli and tomli-w usage (thanks to Michał Górny)super in internal code usageCo-authored-by: Jacob Hayes jacob.r.hayes@gmail.com Co-authored-by: Michał Górny mgorny@gentoo.org
Fixing that the typing pyi files were not included in the manifest (thanks to Julian Torres)
pyi files were not included in the manifest (thanks to Julian Torres)Fixing #218 Box dots would not raise KeyError on bad key (thanks to Cliff Wells)
Adding Cython support to greatly speed up normal Box operations on supported systems
get and checking with in (thanks to scott-createplay)eval-able text (thanks to Jeff Robbins)update and merge_update to not use a keyword that could cause issues in rare circumstances_safe_key logic to be twice as fastHopefully fixing manylinux publish
Add ability to set attributes to ruamel.yaml class
Fixing releases for linux to use manylinux as -linux as not supported by pypi
-linux as not supported by pypiAdding Cython support to greatly speed up normal Box operations on supported systems
get and checking with in (thanks to scott-createplay)eval-able text (thanks to Jeff Robbins)update and merge_update to not use a keyword that could cause issues in rare circumstances_safe_key logic to be twice as fastThis is a pre-release and under testing, do not use in production
Fixing #205 setdefault behavior with box_dots (thanks to Ivan Pepelnjak)
Adding py.typed for mypy support (thanks to Dominic)
Adding support for functions to box_recast (thanks to Jacob Hayes)
merge_update (thanks to Marcos Dione)popitems wasn't first checking if box was frozen (thanks to Varun Madiath)Adding support for functions to box_recast (thanks to Jacob Hayes)
Adding #181 support for extending or adding new items to list during merge_update (thanks to Marcos Dione)
Fixing maintain stacktrace cause for BoxKeyError and BoxValueError (thanks to Jacob Hayes)
Fixing #177 that emtpy yaml files raised errors instead of returning empty objects (thanks to Tim Schwenke)
Fixing #171 that popitems wasn't first checking if box was frozen (thanks to Varun Madiath)
Changing all files to LF line endings
Removing duplicate box_recast calls (thanks to Jacob Hayes)
Removing coveralls code coverage, due to repeated issues with service
Adding checks for frozen boxes to pop, popitem and clear (thanks to Varun Madiath)
pop, popitem and clear (thanks to Varun Madiath)Fixing #165 box_dots to work with default_box
Adding testing for Python 3.9
Fixing #165 box_dots to work with default_box
Adding dotted option for items function (thanks to ipcoder)
dotted option for items function (thanks to ipcoder)Adding #152 dotted option for items function (thanks to ipcoder)
Fixing #157 bug in box.set_default where value is dictionary, return the internal value and not detached temporary (thanks to Noam Graetz)
Removing warnings on import if optional libraries are missing
Fixing default box saving internal method calls and restricted options (thanks to Marcelo Huerta)
Fixing #155 default box saving internal method calls and restricted options (thanks to Marcelo Huerta)
Adding support for msgpack converters to_msgpack and from_msgpack
to_msgpack and from_msgpackBox to other boxes or dicts via the - sub operator #144 (thanks to Hitz)| union boxes like will come default in Python 3.9 from PEP 0584mypy type checking, black formatting and other checks on commitbox_class for cleaner inheritance #148 (thanks to David Aronchick)dotted option for keys method to return box_dots style keys (thanks to ipcoder)Box or BoxList were not fed box properties (thanks to Alexander Kapustin)pop #67 (thanks to Patrock)to_csv and from_csv to have same string and filename options as all other transformsBoxList.box_class to be stored in BoxList.box_options dict as box_classdel will raise BoxKeyError, subclass of both KeyError and BoxErrorkeys, values and items which will return views againAdding support for msgpack converters to_msgpack and from_msgpack
Adding #144 support for comparision of Box to other boxes or dicts via the - sub operator (thanks to Hitz)
Adding support to | union boxes like will come default in Python 3.9 from PEP 0584
Adding mypy type checking, black formatting and other checks on commit
Adding #148 new parameter box_class for cleaner inheritance (thanks to David Aronchick)
Adding #152 dotted option for keys method to return box_dots style keys (thanks to ipcoder)
Fixing box_dots to properly delete items from lists
Fixing box_dots to properly find items with dots in their key
Fixing that recast of subclassses of Box or BoxList were not fed box properties (thanks to Alexander Kapustin)
Changing #150 that sub boxes are always created to properly propagate settings and copy objects (thanks to ipcoder)
Changing #67 that default_box will not raise key errors on pop (thanks to Patrock)
Changing to_csv and from_csv to have same string and filename options as all other transforms
Changing #127 back to no required external imports, instead have extra requires like [all] (thanks to wim glenn)
Changing from putting all details in README.rst to a github wiki at https://github.com/cdgriffith/Box/wiki
Changing BoxList.box_class to be stored in BoxList.box_options dict as box_class
Changing del will raise BoxKeyError, subclass of both KeyError and BoxError
Removing support for single level circular references
Removing readthedocs generation
Removing overrides for keys, values and items which will return views again
Nothing published for this version
Fixing that recast of subclassses of Box or BoxList were not fed box properties (thanks to Alexander Kapustin)
Box or BoxList were not fed box properties (thanks to Alexander Kapustin)Adding dotted and flat option for keys method to return box_dots style keys (thanks to ipcoder)
dotted and flat option for keys method to return box_dots style keys (thanks to ipcoder)Adding support for msgpack coverters to_msgpack and from_msgpack
to_msgpack and from_msgpackBox to other boxes or dicts via the - sub operator #144 (thanks to Hitz)| union boxes like will come default in Python 3.9 from PEP 0584mypy type checking, black formatting and other checks on commitbox_class for cleaner inheritance #148 (thanks to David Aronchick)pop or del #67 (thanks to Patrock)to_csv and from_csv to have same string and filename options as all other transformsBoxList.box_class to be stored in BoxList.box_options dict as box_classkeys, values and items which will return views againFixing README.md example #149 (thanks to J Alan Brogan)
protected_keys to remove magic methods from dict #146 (thanks to Krishna Penukonda)Fixing default_box doesn't first look for safe attributes before falling back to default (thanks to Pymancer)
default_box doesn't first look for safe attributes before falling back to default (thanks to Pymancer)Fixing default_box doesn't first look for safe attributes before falling back to default (thanks to Pymancer)
Changing from TravisCI to Github Actions
Changing that due to default_box fix, pop or del no longer raise BoxKeyErrors on missing items (UNCAUGHT BUG)
Fixing uncaught print statement (thanks to Bruno Rocha)
box_it_up in the documentationAdding optimizations for speed ups to creation and inserts
Box as protected keysmerge_update from incorrectly calling __setattr__ which was causing a huge slowdown (thanks to Jonas Irgens Kylling)copy and __copy__ not copying box optionsAdding support for list traversal with box_dots (thanks to Lei)
box_dots (thanks to Lei)BoxWarning class to allow for the clean suppression of warningsNone (thanks to Wenbo Zhao and Yordan Ivanov)BoxList to properly send internal box options down into new listscamel_killer to convert items on insert, which will change the keys when converted back to dict unlike beforePyYAML if ruamel.yaml is not detected (thanks to wim glenn)pypy as it's pickling behavior is not the same as CPythonFixing get to return None when not using default box (thanks to Jeremiah Lowin)
get to return None when not using default box (thanks to Jeremiah Lowin)Fixing non-string keys breaking when box_dots is enabled (thanks to Marcelo Huerta)
Fixing converters to properly pass through new box arguments (thanks to Marcelo Huerta)
* Fixing setup.py for release * Fixing documentation link
Fixing allowing frozen boxes to be deep copyable (thanks to jandelgado)
Fixing update does not convert new sub dictionaries or lists (thanks to Michael Stella)
Fixing update does not convert new sub dictionaries or lists (thanks to Michael Stella)
Changing update to work as it used to with sub merging until major release
Fixing pop not properly resetting box_heritage (thanks to Jeremiah Lowin)
Fixing propagation of box options when adding a new list via setdefault (thanks to Stretch)
Fixing propagation of box options when adding a new list via setdefault (thanks to Stretch)
Fixing update does not keep box_intact_types (thanks to pwwang)
Fixing update to operate the same way as a normal dictionary (thanks to Craig Quiter)
Fixing deepcopy not copying box options (thanks to Nikolay Stanishev)
Adding license, changes and authors files to source distribution
Adding license, changes and authors files to source distribution
Fixing copy of inherited classes (thanks to pwwang)
get when used with default_boxAdding box_intact_types that allows preservation of selected object types (thanks to pwwang)
box_intact_types that allows preservation of selected object types (thanks to pwwang)Adding BoxObject (thanks to Brandon Gomes)
Adding BoxObject (thanks to Brandon Gomes)
Fixing recursion issue #68 when using setdefault (thanks to sdementen)
Fixing pickling with default box (thanks to sdementen)
Fixing pickling with default box (thanks to sdementen)
Adding hash abilities to new frozen BoxList
Fixing pickling on python 3.7 (thanks to Martijn Pieters)
Adding ordered_box option to keep key order based on insertion (thanks to pwwang)
ordered_box option to keep key order based on insertion (thanks to pwwang)__iter__, __revered__, pop, popitemsFixing __contains__ (thanks to Jiang Chen)
__contains__ (thanks to Jiang Chen)get could return non box objectsAdding copy and deepcopy support that with return a Box object
_box_config was somehow removedFixing first level recursion errors
Your coding agent can read these notes before it upgrades. Set up the MCP server →