First of all, be aware of the limitations of this approach (which will need to
be clearly documented if we go this way):
* It only allows valid Python identifiers -- while JSON accepts any sequence
of Unicode characters for keys
(http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf,
p.5)
* It will clash with any regular attributes of whatever type implements this
senantic
* It's not very scalable and will upset static code checkers and IDEs as it's
impossible to determine if the attribute name is valid or
provide typing hints
--------------------------------------------------------------------------------------------------------------------------------------------
Now, I think it's possible to make a class that would /wrap/ an existing
mapping.
This would completely decouple the convenience syntax from the storage
semantics and any specific modules and types.
When writing a proof-of-concept implementation, however, I bumped into the need to distinguish which of the child objects are containers
(thus need to be wrapped as well) and which are the leaves (thus need to be returned as is). I guess this is going to be
application-specific. And the same problem will arise with any implementation, not only a wrapper.
On 15.04.2020 5:59, Raymond Hettinger wrote:
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 -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/python-dev@python.org/message/JOMND56PJGRN7FQQLLCWONE5Z7R2EKXW/
Code of Conduct: http://python.org/psf/codeofconduct/
--
Regards,
Ivan
_______________________________________________
Python-Dev mailing list -- python-dev@python.org
To unsubscribe send an email to python-dev-le...@python.org
https://mail.python.org/mailman3/lists/python-dev.python.org/
Message archived at
https://mail.python.org/archives/list/python-dev@python.org/message/IEKXDY7HUUCGF4BI327URFAWV67WQJZJ/
Code of Conduct: http://python.org/psf/codeofconduct/