seeking deeper (language theory) reason behind Python design choice
Ian Kelly
ian.g.kelly at gmail.com
Thu May 10 22:38:39 EDT 2018
On Thu, May 10, 2018 at 7:10 PM, Chris Angelico <rosuav at gmail.com> wrote:
> On Fri, May 11, 2018 at 10:29 AM, Marko Rauhamaa <marko at pacujo.net> wrote:
>> Chris Angelico <rosuav at gmail.com>:
>>
>>> But for the loop itself, you absolutely CAN write this more logically.
>>> I'll take your second version as a template:
>>>
>>> def split_cmd(self, cmd):
>>> args = []
>>> while (match := self.TERM_PTN.match(cmd)) is not None:
>>> args.append(match.group('term'))
>>> if not match.group('sep'):
>>> verb = args.pop(0).upper()
>>> return verb, args
>>> cmd = cmd[match.end(0):]
>>> return None, None
>>>
>>> And, if this is actually a regex, "is not None" is unnecessary:
>>>
>>> while match := self.TERM_PTN.match(cmd):
>>>
>>> Now do you understand what I mean about putting the condition into the
>>> loop header?
>>
>> Thanks, but no thanks. The "while True" idiom beats that one hands down.
>
> Because you're used to it? Or because it's somehow more logical to
> pretend that this is an infinite loop? Explain in more detail.
In what way does "while True" in the general case pretend to be an
infinite loop? The break / return is right there for anyone to see.
Would you also contend that generator functions are wrong because they
pretend to be normal functions?
def totally_not_a_generator(n):
while True:
if n % 2 == 0:
n //= 2
else:
n = n * 3 + 1
stealthily = n
yield stealthily
if n == 1:
return n
py> print(totally_not_a_generator(42)) # Lies!
<generator object totally_not_a_generator at 0x77fe4d78c0f8>
More information about the Python-list
mailing list