On Fri, Sep 18, 2015 at 11:21 PM, Guido van Rossum <guido@python.org> wrote:
On Fri, Sep 18, 2015 at 8:41 PM, Steven D'Aprano <steve@pearwood.info> wrote:
It's a funny thing, I'm usually not a huge fan of symbols outside of
maths operators, and I strongly dislike the C ? ternary operator, but
this one feels really natural to me. I didn't have even the most
momentary "if you want Perl, you know where to find it" thought.

I do, but at least the '?' is part of an operator, not part of the name (as it is in Ruby?).

I really, really, really don't like how it looks, but here's one thing: the discussion can be cut short and focus almost entirely on whether this is worth making Python uglier (and whether it's even ugly :-). The semantics are crystal clear and it's obvious that the way it should work is by making "?.", ?(" and "?[" new operators or operator pairs -- the "?" should not be a unary postfix operator but a symbol that combines with certain other symbols.

I really liked this whole thread, and I largely still do -- I?think -- but I'm not sure I like how `?` suddenly prevents whole blocks of code from being evaluated. Anything within the (...) or [...] is now skipped (IIUC) just because a `?` was added, which seems like it could have side effects on the surrounding state, especially since I expect people will use it for squashing/silencing or as a convenient trick after the fact, possibly in code they did not originally write.

If the original example included a `?` like so:

    response = json.dumps?({
        'created': created?.isoformat(),
        'updated': updated?.isoformat(),
        ...
    })

should "dumps" be None, the additional `?` (although though you can barely see it) prevents *everything else* from executing. This may cause confusion about what is being executed, and when, especially once nesting (to any degree really) and/or chaining comes into play!

Usually when I want to use this pattern, I find I just need to write things out more. The concept itself vaguely reminds me of PHP's use of `@` for squashing errors. In my opinion, it has some utility but has too much potential impact on program flow without being very noticeable. If I saw more than 1 per line, or a couple within a few lines, I think my ability to quickly identify -> analyze -> comprehend possible routes in program control flow decreases. I feel like I'll fault more, double back, and/or make sure I forevermore look harder for sneaky `?`s.

I probably need to research more examples of how such a thing is used in real code, today. This will help me get a feel for how people might want to integrate the new `?` capability into their libraries and apis, maybe that will ease my readability reservations.

Thanks,

--

C Anthony