Congrats to Chris for breaking his PEP curse
Steven D'Aprano
steve+comp.lang.python at pearwood.info
Wed Jul 4 03:05:44 EDT 2018
On Tue, 03 Jul 2018 23:05:01 -0600, Ian Kelly wrote:
> Now that I've actually read the PEP (sorry, I just assumed it would
> never fly), I have a couple of (tongue-in-cheek) observations about it:
>
>> group = re.match(data).group(1) if re.match(data) else None
>
> The only problem with this example of doing more work to save a line of
> code is that presumably the same programmer would now instead write:
>
>> group = match.group(1) if match := re.match(data) else None
There's no stopping some people from making poor naming choices. Surely
the standard name for match objects is "mo", not match?
But if people were going to write that, surely they would now write:
match = re.match(pattern, data)
group = match.group(1) if match else None
and I don't see how spreading it over two statements makes it better.
Either you can tell the difference between re.match(pattern, data) and
match, in which case one line or two makes little difference, or you
can't, in which case one line or two makes little difference.
group = re.match(pat, data).group(1) if re.match(pat, data) else None
group = mo.group(1) if mo := re.match(pat, data) else None
The second works for me.
> Secondly, I believe the order of evaluation means that, much as I would
> like to, I can't now write all my statements as:
>
> f(f := lambda f: do_something())
>
> Because the outer f will be evaluated before the argument expression
> assigns it.
Watch out that you don't poke your tongue all the way through your
cheek :-)
> Well, that's no fun. Is it too late to fix this? I'm only
> half-joking here;
It doesn't work now:
class X: pass
obj = X()
obj.f(setattr(obj, "f", lambda f: print(f+1)))
raises AttributeError, as it bloody well ought to :-)
> if it worked, this would be a much better way to pass
> a lambda to itself for recursion than the existing idiom:
>
> (lambda f: lambda *a: f(f, *a))(lambda s, x: 1 if x==0 else x * s(s,
> x-1))(10)
/me reads that code
"Kill it! Kill it with fire!!!"
That was my *second*, more polite, reaction :-)
> That's a factorial function, in case you couldn't tell.
Well obviously.
> Oh well, at least now I'll be able to write exec(x := 'del x').
I am *so* going to use that instead of "pass" from now on ;-)
--
Steven D'Aprano
"Ever since I learned about confirmation bias, I've been seeing
it everywhere." -- Jon Ronson
More information about the Python-list
mailing list