cdgriffith/Box

__repr__ and __str__ suggestion

jrobbins-LiveData opened this issue · 2 comments

The current __repr__ function, while perfectly valid per the Python docs, could be made more informative by indicating that nested dicts are actually also Box objects. With a couple of small changes, as sketched below, that missing info could be made available, along with making the __repr__ output evalable, which is also valid per the Python docs.

from box import Box


def main():
    b1 = Box({'outer': {'k1': 'v1', 'inner': {'k2': 'v2'}}})
    print(f"before new methods: {b1=}")

    Box.__repr__ = lambda self: f"Box({self})"
    Box.__str__ = lambda self: f"{ {k:v for k,v in self.items()} }"

    print(f" after new methods: {b1=}")
    print(f"{eval(repr(b1))=}")


if __name__ == "__main__":
    main()
before new methods: b1=<Box: {'outer': {'k1': 'v1', 'inner': {'k2': 'v2'}}}>
 after new methods: b1=Box({'outer': Box({'k1': 'v1', 'inner': Box({'k2': 'v2'})})})
eval(repr(b1))=Box({'outer': Box({'k1': 'v1', 'inner': Box({'k2': 'v2'})})})

Correct code, instead of my quick and dirty monkey patch, should use self._box_config["box_class"] instead of hardcoding Box in the __repr__ function like I did.

Adding these features in 6.0, currently have a release candidate that can be installed and tested with:

pip install python-box[all]==6.0.0rc2 --upgrade 

6.0 is ushering in Cython speedups on supported platforms, so please let me know if you run into any issues!

Box 6 has been released with this added, thanks for opening the issue!