SimpleNamespace() is really good at giving attribute style-access. I would like
to make that functionality available to the JSON module (or just about anything
else that accepts a custom dict) by adding the magic methods for mappings so
that this works:
catalog = json.load(f, object_hook=SimpleNamespace)
print(catalog['clothing']['mens']['shoes']['extra_wide']['quantity'])
# currently possible with dict()
print(catalog.clothing.mens.shoes.extra_wide.quantity]) #
proposed with SimpleNamespace()
print(catalog.clothing.boys['3t'].tops.quantity
# would also be supported
I've already seen something like this in production; however, people are having
to write custom subclasses to do it. This is kind of bummer because the custom
subclasses are a pain to write, are non-standard, and are generally somewhat
slow. I would like to see a high-quality version this made more broadly
available.
The core idea is keep the simple attribute access but make it easier to load
data programmatically:
>>> ns = SimpleNamespace(roses='red', violets='blue')
>>> thing = input()
sugar
>>> quality = input()
sweet
>>> setattr(ns, thing, quality) # current
>>> ns['sugar'] = 'sweet' # proposed
If the PEP 584 __ior__ method were supported, updating a SimpleNamespace would
be much cleaner:
ns |= some_dict
I posted an issue on the tracker: https://bugs.python.org/issue40284 . There
was a suggestion to create a different type for this, but I don't see the point
in substantially duplicating everything SimpleNamespace already does just so we
can add some supporting dunder methods. Please add more commentary so we can
figure-out the best way to offer this powerful functionality.
Raymond
_______________________________________________
Python-Dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/[email protected]/message/JOMND56PJGRN7FQQLLCWONE5Z7R2EKXW/
Code of Conduct: http://python.org/psf/codeofconduct/