On Fri, Sep 25, 2015 at 01:30:54AM +0100, Erik wrote:
Throwing this one out there in case it inspires someone to come up with a better variation (or to get it explicitly rejected):
object.(<accessor> if <condition> else <expr>)
... where 'accessor' is anything normally allowed after 'object' ([], (), attr) and 'condition' can omit the LHS of any conditional expression (which is taken the associated object) or not (i.e., can be a complete condition independent of the associated object):
foo = bar.((param0, param1) if not None else default())
I think that your intention is for that to be equivalent to: if bar not None: # missing "is" operator foo = bar(param0, param1) else: foo = default() I had to read your description three times before I got to the point where I could understand it. Some problems: I thought `bar.(<accessor> ...)` meant attribute access, so I initially expected the true branch to evaluate to: foo = bar.(param0, param1) which of course is a syntax error. Presumably you would write `bar.(attr if ...)` for attribute access and not `bar.(.attr if ...)`. I'm still confused about the missing `is`. Maybe you meant: if not None: # evaluates to True ... which is a problem with your suggestion that the left hand side of the condition is optional -- it makes it harder to catch errors in typing. Worse, it's actually ambiguous in some cases: spam = eggs.(cheese if - x else "aardvark") can be read as: if eggs - x: # implied bool(eggs - x) spam = eggs.cheese else: spam = "aardvark" or as this: if -x: # implied bool(-x) spam = eggs.cheese else: spam = "aardvark"
foo = bar.([idx] if != sentinel else default())
I **really** hate this syntax. It almost makes me look more fondly at the || / !| syntax. Looking at this, I really want to interprete the last part as foo = bar.default() so I can see this being a really common error. "Why isn't my method being called?" -1 on this. -- Steve