On Wed, Jul 25, 2018 at 10:41 PM Chris Angelico <rosuav@gmail.com> wrote:
A bit problematic. But after (a) figuring out that your module is
named "coalesce" even though I installed "coalescing" AND (b) going
and separately installing wrapt, and finally (c) doing the import that
you didn't mention, we still have this fundamental problem:

Yeah, yeah.  I know it's alpha software I wrote two nights ago, and slightly patched 5 minutes before that post.  You fixed those concerns; I'll happily take PRs on fixing them better.
 
>>> from coalesce import NullCoalesce
>>> from types import SimpleNamespace
>>> spam, spam.eggs, spam.eggs.bacon = SimpleNamespace(), SimpleNamespace(), 42
>>> NullCoalesce(spam).eggs.bacon
<NullCoalesce proxy for 42>

That isn't 42. That's a thing that, forever afterwards, will be a
proxy.

Yeah.  That's a thing it does.  It's less of an issue than you think since, e.g.:

>>> from coalesce import NullCoalesce
>>> from types import SimpleNamespace
>>> spam, spam.eggs, spam.eggs.bacon = SimpleNamespace(), SimpleNamespace(), 42
>>> NullCoalesce(spam).eggs.bacon + 1
43
>>> NullCoalesce(spam).eggs.bacon * 1
42

Most things you actually do with the proxy wind up getting the value back once it is used.  However, this seems to be a bug that I inherit from wrapt.ObjectProxy:

>>> NullCoalesce(spam).eggs.bacon + 0
ValueError: wrapper has not been initialized
 
If you do an operation that combines the proxy value with "Falsey" values, it doesn't do the implicit unboxing.  Same with e.g. `proxyval + ""` for strings, unfortunately.  I'm not sure how to fix that.

>>> spam.nil = None
>>> print(NullCoalesce(spam).nil.nil)
None
>>> print(NullCoalesce(spam).nil.nil.nil)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'nil'

Why is this wrong? This is EXACTLY the same behavior as the `?.` operator would have in the last case.  Do you not recognize the behavior you are advocating in PEP 505?

I recognize that the proxy value not always "auto-unboxing" is a limitation that I don't like.

--
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.