[Matthew Woodcraft] >>> Well, that's a reason to make the example a bit more realistic, then. >>> >>> Say: >>> >>> if match := re.search(pat1, text): >>> do_something_with(match.group(0)) >>> elif match := re.search(pat2, text): >>> do_something_else_with(match.group(0), match.group(1)) >>> elif match := re.search(pat3, text): >>> do_some_other_things_with(match.group(0)) >>> and_also_with(match.group(1), match.group(2)) [Steven D'Aprano <steve at pearwood.info>] >> I don't think that a bunch of generic "do_something_with" functions is >> precisely "realistic". >> >> If I saw something like that, I'd try very hard to find a way to >> refactor it into code like this: >> >> for handler in handlers: >> if handler.match(text): >> handler.process() >> break >> else: >> # handle no-match case here >> >> where the knowledge of what to search for, where to search for it, how >> to search for it, and what to do when found, was encapsulated in the >> handler objects. Your tastes may vary. >> >> But your point is well-taken that the version with binding assignment >> (thanks Tim!) is nicer to read than the current procedural version: >> >> match = re.search(pat1, text) >> if match: >> do_something_with(match.group(0)) >> else: >> match = re.search(pat2, text) >> if match: >> do_something_else_with(match.group(0), match.group(1)) >> else: >> match = = re.search(pat3, text) >> do_some_other_things_with(match.group(0)) >> and_also_with(match.group(1), match.group(2)) >> >> I just don't think it counts as a motivating use-case distinct from the >> single match case. [Guido] > The version of this code found in reality is not as regular as the example > quoted, and the rebuttal "but I would rewrite it with a loop" shoots a straw > man. To me the if-elif-elif portion of the example is very much a separate > motivation, since being able to put the assignment in the elif clause avoids > runaway indentation. I've regretted not being able to use elif in this kind > of situation many times, whereas in the single match case I don't find it a > burden to assign the variable in a separate statement preceding the > if-clause. (I guess this is a case of "flat is better than nested" -- thanks > Tim! :-) Au contraire - thank you for forcing me to channel you succinctly lo those many years ago ;-) And for pointing out this real use case, which I'm not sure has been stressed before. The PEP could clearly use more motivating examples, and this is a fine class of them. Few things are more maddening than runaway cascading indentation :-( And noting again that a simple "binding expression" (my neologism for `identifier ":=" expression`, to break the reflexive horror at imagining the full complexity of assignment statements being allowed everywhere expressions are allowed) is sufficient to address it.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4