
So you're offering `NoneCoalesce(x).bar` as less-ugly alternative to `x?.bar`... Color me unconvinced. On Sat, Sep 10, 2016 at 4:06 PM, David Mertz <mertz@gnosis.cx> wrote:
Actually, I guess the example I liked was from the year ago discussion. And it didn't do *exactly* what I think a wrapper should. What I'd want would be like this:
class NoneCoalesce(object): "Standard operations on object for 'is not None'" def __init__(self, obj): self.obj = obj
def __getattr__(self, name): try: return getattr(self.obj, name) except AttributeError: return NoneCoalesce(None)
def __getitem__(self, item): try: return self.obj[item] except (TypeError, KeyError): return NoneCoalesce(None)
def __call__(self, *args, **kwds): try: return self.obj(*args, **kwds) except TypeError: return NoneCoalesce(None)
def __bool__(self): return self.obj is not None
def __repr__(self): return "NoneCoalesce[%r]" % self.obj
def __str__(self): return "NoneCoalesce[%r]" % self.obj
def __len__(self): try: return len(self.obj) except TypeError: return 0
Then we might use it similar to this:
from boltons.dictutils import OrderedMultiDict from NoneCoalesce import NoneCoalesce omd = OrderedMultiDict() omd['a'] = 1 omd['b'] = 2 omd.add('a', 3) nc = NoneCoalesce(omd) nc or "Spanish Inquisition" Out[8]: NoneCoalesce[OrderedMultiDict([('a', 1), ('b', 2), ('a', 3)])] nc.spam or "Spam" Out[9]: 'Spam' nc['nope'].bar.baz() Out[10]: NoneCoalesce[None] nc['a'] Out[11]: 3 nc.getlist('a') Out[12]: [1, 3]
Nothing special about boltons' OrderedMultiDict here, just something I've been playing with that has some distinctive methods.
The idea is that we can easily have both "regular" behavior and None coalescing just by wrapping any objects in a utility class... and WITHOUT adding ugly syntax. I might have missed some corners where we would want behavior wrapped, but those shouldn't be that hard to add in principle.
On Sat, Sep 10, 2016 at 3:21 PM, David Mertz <mertz@gnosis.cx> wrote:
I find the '?.' syntax very ugly, much more so in the examples of chained attributes.
A much better way to handle the use case is to wrap objects in a class that gives this "propagating None" behavior with plain attribute access. A nice implementation was presented in this thread.
On Sep 10, 2016 3:16 PM, "Random832" <random832@fastmail.com> wrote:
On Sat, Sep 10, 2016, at 13:26, Guido van Rossum wrote:
The way I recall it, we arrived at the perfect syntax (using ?) and semantics. The issue was purely strong hesitation about whether sprinkling ? all over your code is too ugly for Python
I think that if there's "strong hesitation" about something being "too ugly" it can't really be described as "the perfect syntax". IIRC there were a couple alternatives being discussed that would have reduced the number of question marks to one [or one per object which might be None]. _______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/
-- Keeping medicines from the bloodstreams of the sick; food from the bellies of the hungry; books from the hands of the uneducated; technology from the underdeveloped; and putting advocates of freedom in prisons. Intellectual property is to the 21st century what the slave trade was to the 16th.
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/
-- --Guido van Rossum (python.org/~guido)