[Python-ideas] Inline assignments using "given" clauses
storchaka at gmail.com
Fri May 4 13:35:54 EDT 2018
04.05.18 15:06, Nick Coghlan пише:
> Recapping the use cases where the inline assignment capability received
> the most agreement regarding being potentially more readable than the
> status quo:
Sorry, but these examples don't look as good examples for inline
assignments to me. I think that all these cases can be written better
without using the inline assignment.
> 1. Making an "exactly one branch is executed" construct clearer than is
> the case for nested if statements:
> if m := pattern.search(data):
> elif m := other_pattern.search(data):
This case can be better handled by combining patterns in a single
pattern = re.compile('(?P<foo>pattern1)|(?P<bar>pattern2)|...')
m = pattern.search(data)
if not m: # this can be omitted if the pattern is always found
See for example gettext.py where this pattern is used.
> 2. Replacing a loop-and-a-half construct:
> while m := pattern.search(remaining_data):
This case can be better handled by re.finditer().
for m in pattern.finditer(remaining_data):
In more complex cases it is handy to write a simple generator function
and iterate its result.
The large number of similar cases are covered by a two-argument iter().
> 3. Sharing values between filtering clauses and result expressions in
> result = [(x, y, x/y) for x in data if (y := f(x))]
There are a lot of ways of writing this. PEP 572 mentions them.
Different ways are used in real code depending on preferences of the
author. Actually the number of these cases is pretty low in comparison
with the total number of comprehensions.
It is possible to express an assignment in comprehensions with the "for
var in [value]" idiom, and this idiom is more powerful than PEP 572 in
this case because it allows to perform an assignment before the first
'for'. But really complex comprehensions could be better written as
'for' statements with explicit adding to the collection or yielding.
More information about the Python-ideas