[Python-Dev] assignment expressions: an alternative proposal

Nick Coghlan ncoghlan at gmail.com
Tue Apr 24 11:55:36 EDT 2018


On 25 April 2018 at 01:35, Yury Selivanov <yselivanov.ml at gmail.com> wrote:
> On Tue, Apr 24, 2018 at 11:31 AM, Nick Coghlan <ncoghlan at gmail.com> wrote:
>> I *do* think the "no name rebinding except in a while loop header"
>> restriction would be annoying for the if/elif use case and the while
>> use case:
>>
>>     while (item = get_item()) is not first_delimiter:
>>         # First processing loop
>>     while (item = get_item()) is not second_delimiter:
>>         # Second processing loop
>>     # etc...
>>
>>     if (target = get_first_candidate()) is not None:
>>         ...
>>     elif (target = get_second_candidate()) is not None:
>>         ...
>>     elif (target = get_third_candidate()) is not None:
>>         ...
>
> Yes, it would force users to come up with better names *iff* they want
> to use this new sugar:
>
>   if (first_target = get_first_candidate()) ...
>   elif (second_target = get_second_candidate()) ...

Sorry, I didn't make the intended nature of that example clear:

    if (target = get_first_candidate()) is not None:
        ... # Any setup code specific to this kind of target
    elif (target = get_second_candidate()) is not None:
        ... # Any setup code specific to this kind of target
    elif (target = get_third_candidate()) is not None:
        ... # Any setup code specific to this kind of target
    else:
        raise RuntimeError("No valid candidate found")
    # Common code using target goes here

Using a separate name in each branch wouldn't solve the problem of
binding the *same* name for the common code to use later - you'd have
to put a "target = candidate_n" bit of boilerplate in each branch.

Cheers,
Nick.

-- 
Nick Coghlan   |   ncoghlan at gmail.com   |   Brisbane, Australia


More information about the Python-Dev mailing list