[Python-Dev] Call for prudence about PEP-572

Chris Angelico rosuav at gmail.com
Sun Jul 8 13:23:50 EDT 2018


On Mon, Jul 9, 2018 at 3:14 AM, Giampaolo Rodola' <g.rodola at gmail.com> wrote:
>
>
> On Sun, Jul 8, 2018 at 6:45 PM Steve Holden <steve at holdenweb.com> wrote:
>>
>> On Sun, Jul 8, 2018 at 10:41 AM, Giampaolo Rodola' <g.rodola at gmail.com>
>> wrote:
>>>
>>> [...]
>>> I find that (space between the parentheses of a function call statement)
>>> too unnatural as a place where to put an assignment. It is not even
>>> "guarded" by a keyword like "if" or  "while" which can help as indicators
>>> that an assignment may occur. Also, I think it's way too easy to confuse it
>>> with a keyword argument:
>>>
>>>     >>> foo(x = 1)  # keyword arg
>>>     >>> foo(x := 1)  # assignment + value passing
>>> [...]
>>
>>
>> But the PEP 8 spellings are
>>
>>     foo(x=1)
>>
>> and
>>
>>    f(x := 1).
>>
>> The extra spacing makes it obvious that this isn't a regular named
>> argument.
>
>
> What if the author of the code I'm reading didn't respect PEP-8? I don't
> think it's fair to invoke PEP-8 as a counter-measure to obviate a syntax
> which can clearly be mistaken with something else simply by omitting 2
> spaces. Not to mention that I don't see why anyone would want to declare a
> variable in there in the first place.
>

It's not about why someone would want to assign inside a function
call. It's about why it should be forbidden. Perhaps nobody has a good
reason to use THlS_OBJECT as a variable name, and it's potentially
very confusing; but should the grammar of Python forbid it? No.
Because there is no value in forbidding it.

Python's grammar has a number of weird edge cases due to necessity
(for instance, "for x in a if cond else b:" works, but not in a
comprehension), and when there's an actual conflict, sure, you can say
"but nobody would ever want to do that, so we'll forbid it". In this
case, there is no conflict.

ChrisA


More information about the Python-Dev mailing list