[Python-ideas] PEP 505: None-aware operators
George Leslie-Waksman
waksman at gmail.com
Thu Jul 19 03:38:58 EDT 2018
I am rather fond of the idea of null-coalescing, at the very least, for
mutable default values:
def foo(a=None):
a ??= []
...
but I worry about the code messes we will run into with some of the other
options.
Woe be unto anyone forced to understand the behavior of:
thing?.attr?[key]?.subattr ?? 127
What if we added the Elvis operator "?:" for null coalescing and left the
rest for future consideration
On Wed, Jul 18, 2018 at 10:49 PM Tim Peters <tim.peters at gmail.com> wrote:
> [Steve Dower <steve.dower at python.org>]
>
>> ...
>
> * The "``None``-aware attribute access" operator ``?.`` evaluates the
>> complete expression if the left hand side evaluates to a value that is
>> not
>> ``None``
>>
>
> And if the LHS does evaluate to `None` ...? I'll assume the result is
> also `None` then.
>
>
>> ...
>
>
>> From ``inspect.py``::
>>
>> for base in object.__bases__:
>> for name in getattr(base, "__abstractmethods__", ()):
>> value = getattr(object, name, None)
>> if getattr(value, "__isabstractmethod__", False):
>> return True
>>
>> After updating to use the ``?.`` operator (and deliberately not
>> converting to use ``any()``)::
>>
>> for base in object.__bases__:
>> for name in base?.__abstractmethods__ ?? ():
>> if object?.name?.__isabstractmethod__:
>> return True
>>
>
> I got lost on the `for` here. The part following `in`:
>
> for name in getattr(base, "__abstractmethods__", ()):
>
> looks in `base` (regardless of whether `base` is `None`) for an attribute
> named "_abstractmethods__".. If such an attribute exists, the value of
> the attribute is returned (`None` or not). Else an AttributeError is
> swallowed and `()` is returned. It's hard to see how
>
>
> for name in base?.__abstractmethods__ ?? ():
>
> does the same. If `base` itself is `None`, I guess it returns `()`, or
> if `base` has an "_abstractmethods__" attribute then the value of that
> attribute is returned - unless its value is None, in which case `()` is
> again returned. But if `base` is not `None` and the attribute does not
> exist, doesn't this raise AttributeError? The later "Exception-aware
> operators" section seemed to explicitly reject the idea that `?.` and `?[]`
> would suppress AttributeError and/or TypeError.
>
> In short, the original getattr() didn't care at all whether `base` was
> `None`, or whether the value of its "__abstractmethods__" attribute was
> `None`, but cared a whole lot about whether that attribute exists. I just
> can't see how the updated code matches that in any of those respects.
>
> Ignoring that and pressing on, I suffer the same kind of confusions on the
> `if` part. What am I missing? For example, do these operators swallow
> exceptions after all?
>
> _______________________________________________
> Python-ideas mailing list
> Python-ideas at python.org
> https://mail.python.org/mailman/listinfo/python-ideas
> Code of Conduct: http://python.org/psf/codeofconduct/
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20180719/82ec2c0a/attachment-0001.html>
More information about the Python-ideas
mailing list