On 2018-07-31 20:53, Jonathan Fine wrote:
Stephan Houben wrote:

Nope, the introduction of the tmp variable changed the semantics. It isn't a
"chain" anymore so it breaks shortcutting.

I'm confused. Assume 'a' is not defined.

With Python's dot (attribute access) we have
a.b.c
NameError: name 'a' is not defined
a.(b.c)
SyntaxError: invalid syntax
(a.b).c
NameError: name 'a' is not defined

I'd expect, after PEP 505 is added to Python that we'd get
a ?. b ?. c
NameError: name 'a' is not defined
a ?. (b ?. c)
SyntaxError: invalid syntax
(a ? . b) ?. c
NameError: name 'a' is not defined

If this is not correct, please some do tell me what we would get.

Correct.

Now assume 'a' is defined. I'd also expect, for any value for 'a', that
tmp = (a ?. b)
val = tmp ?. c
give val the same value as
val = (a ?. b) ?. c

If this is not so, then can the second val be computed from tmp? And if so, how?

Also correct.

On the first point, Steven said that _figuratively speaking_ (his words) the series of attribute accesses would be _as though_ it was grouped a?.(b.c), so if a is None, then remainder of the attributes accessed would be short-circuited. He _wasn't_ suggesting that that was _actual_ syntax.

On the second point, you'd said:

    tmp = spam ?. eggs
    val2 = tmp . cheese . aardvark    # For spam?.eggs.cheese.aardvark

i.e. that:

    spam?.eggs.cheese.aardvark

could be rewritten as:

    tmp = spam ?. eggs
    val2 = tmp . cheese . aardvark

Steven pointed out that that was wrong.

In the first, if spam is None, then the remainder is short-circuited, and so the result of spam?.eggs.cheese.aardvark is None.

In the second, if spam is None, then tmp would be None, and tmp.cheese would fail.
_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to