4 ms·
I will be happy to be able to do: while (bytes := io.get(x)): and: [bar(x) for z in stuff if (x := foo(z))] Every time Python adds an expression c
by sametmax 8y ago
I will be happy to be able to do:
while (bytes := io.get(x)):
and:
[bar(x) for z in stuff if (x := foo(z))]
Every time Python adds an expression counterpart to an existing statement (lambdas, intensions, ternary...) there is a (legit) fear it will be abused.
But experience tells that the slow and gradual pace of the language evolution combined with the readability culture of the community don't lead that way.
While we will see code review breaking materials in the wild, I believe that the syntax will mostly be used sparingly, as other features, when the specific needs arise for it.
After all, it's been, as usual, designed with this in mind: "=" and ":=" are mutually exclusive. You don't use them in the same context.
The grammar makes sure of it most of the time, and for the rare ambiguities like:
a = b
vs
(a := b)
The parenthesis will discourage pointless usage.
My bet is that we will see essentially rare but useful and expressive use cases in productions, which is exactly the goal.
Given the month of debates around this, I think it's a fine compromise.
Like many, I would have preferred the use of the "as" keyword instead of a new operator, since it's already used to bind things to names in imports, context managers and try/except.
However, the new syntax has 2 advantages: it reads the same way than the original operator, and it supports type hints out of the box.
- deleted 8y ago[deleted]
- smcl 8y ago> Every time Python adds an expression counterpart to an existing statement (lambdas, intensions, ternary...) What do you mean by "intension"? I haven't seen this referred to in python and googling isn't turning out anything useful (also spelling it as "intention").
- sametmax 8y agoSorry, french word for "comprehension". It pops up automatically. I can't edit my post anymore though. The worst for me is OOP. In french it's POO, which, for obvious reasons, does not inspire confidence in an english reader.
- smcl 8y agoAhhhhhh - thanks!
- makapuf 8y agoDid you mean intention (french spelling) is a translation for list comprehension ? First time I've seen it used ( https://fr.m.wikipedia.org/wiki/Liste_en_compr%C3%A9hension https://fr.m.wikipedia.org/wiki/Liste_en_compr%C3%A9hension ) Sorry if I misunderstood.
- sametmax 8y agoNot 'intention' (will/wish), but 'intension' (as the opposite of extension: see https://fr.wikipedia.org/wiki/Intension_et_extension https://fr.wikipedia.org/wiki/Intension_et_extension). "comprehension list" in french can be translated to "liste en intension"
- dorfsmay 8y agoInteresting, the word exist in English too, but I cannot find anywhere how it is supposed to be pronounced, in either language.
- misterkeys 8y agoUnfortunately, at least in English, it's pronounced the same as intention. This causes brief confusion in introductory logic and semantics classes everywhere.
- makapuf 8y agoTIL, thanks. It seems to be the kind of perfectly adapted idiom (that no one uses or understand).
- repsilat 8y ago> [bar(x) for z in stuff if (x := foo(z))] Someone showed me this in a previous thread: >> [bar(foo_z) for z in stuff for foo_z in [foo(z)] if foo_z] Not a common idiom, though. Neither snippet is perfectly clear to me, but yours is closer.
- ehsankia 8y agoThe iterating over map(foo, stuff) version is much cleaner and readable imo
- gshulegaard 8y agoI agree that I would have preferred "as"...but that said I am struggling to think of a reason this is needed. while (bytes := io.get(x)): Would currently be written: bytes = io.get(x) while bytes: And likewise: [bar(x) for z in stuff if (x := foo(z))] is equivalently: [bar(foo(z)) for z in stuff if foo(z)] Perhaps this is just my personal opinion but I don't really think the ":=" (or "as" for that matter) adds much in the way of clarity or functionality. I guess at the end of the day I am neutral about this addition...but if there isn't a clear upside I usually think it's better to have less rather than add more.
- Dunnorandom 8y agoThe first example would actually be equivalent to something like while True: bytes = io.get(x) if not bytes: break ... which I think is objectively less readable. In the second example, you have an extra call to foo for every element of stuff. If foo(z) is expensive, you'd probably want to write this as [bar(x) for x in map(foo, stuff) if x] instead - which I personally don't mind, but it's arguably not as clear as having the in-line assignment expression.
- amorousf00p 8y agoQuibbles and bits. Python is the only language where I write logic and then massage data structures and outputs + design 'cooler' ways to create these for an extra hour -- a week after it is in production.
- gshulegaard 8y agoI wasn't really considering the repeated genearation on `io` in the `while` example...so now I see a clear benefit to the syntax. I guess I would say I am now lukewarm about adding this additional operator. It makes at least one logical structure nicer...but I wouldn't have been heartbroken if it wasn't accepted though.
- roman_g 8y agoAnd if foo(z) is consuming a generator somehow (e.g. it's next(g)) then you can't call it twice without side effects.
- nuclear_eclipse 8y ago> and it supports type hints out of the box From my reading of the PEP, assignment expressions specifically prohibit type annotations.
- alew1 8y agoQuestion: in the list comprehension example, is `x` defined outside the loop comprehension? Will it overwrite an existing `x`? Or is it like `z` and only visible inside the loop comprehension? The latter would make more sense, I think.