[Python-Dev] PEP 572: Assignment Expressions (original) (raw)

Nick Coghlan ncoghlan at gmail.com
Tue Apr 24 09:37:42 EDT 2018


On 24 April 2018 at 22:30, David Mertz <mertz at gnosis.cx> wrote:

I do think the pronunciation issue that Greg notices is important. I teach Python for most of my living, and reading and discussing code segments is an important part of that. When focussing on how Python actually spells something, you can't always jump to the higher-level meaning of a construct. For some complex expression—whether or not "binding expressions" are added—sometimes it makes sense to give a characterization of the meaning of the expression, but other times you want to say aloud the entire spelling of the expression.

Although feelings are mixed about this, I like the "dunder" contraction for this purpose. It's less of a mouthful to say "dunder-init" than "underscore-underscore-init-underscore-underscore" aloud. And once you learn that shorthand, it's unambiguous. I think I'd pronounce: if (diff := x - xbase) and (g := gcd(diff, n)) > 1: return g As: "If diff bound to x minus xbase (is non-zero), and g bound to gcd of diff comma n is greater than 1, return g"

Pronouncing it as "name bound to expr" would also fit well with calling the overall construct a binding expression.

You could also postpone the definitions to the end when speaking aloud:

"if diff is true and g is greater than 1, then return g, given

that diff is bound to ex minus ex-base and g is bound to the gcd of diff and n"

However, that long form sounded awkward to me, though, so I ended up wanting to rephrase it as just:

"if diff is true and g is greater than 1, then return g, given

that diff is ex minus ex-base and g is the gcd of diff and n"

(The only change is to replace both occurrences of "is bound to" with a simple "is")

And writing that out actually gave me an idea that I don't believe has come up before (or if it did, it got lost somewhere in the depths of a long python-ideas thread):

 if (diff is= x - x_base) and (g is= gcd(diff, n)) > 1:
     return g

With the mnemonic for what the binding expression means being the following invariant:

_rhs = expr
assert (name is= _rhs) is _rhs and name is _rhs

In a very real sense, that's exactly recreating the C pointer semantics for "==" ("check if two pointers reference the same object") vs "=" ("make two pointers reference the same object"), we'd just be spelling it as "is" vs "is=".

Given that spelling, a reasonable inline pronunciation of "is=" would still be Davids suggestion of "is bound to":

"if diff is bound to ex minux ex-base and is true and g is bound

to the gcd of diff and n and is greater than 1, then return g"

Simplifying "is bound to" to "is" in the post-definition form would just be a verbal shorthand.

Cheers, Nick.

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



More information about the Python-Dev mailing list