| |
Subscribe / Log in / New account

PEP 572 and decision-making in Python

Did you know...?

LWN.net is a subscriber-supported publication; we rely on subscribers to keep the entire operation going. Please help out by buying a subscription and keeping LWN on the net.

By Jake Edge
June 20, 2018
Python Language Summit

The "PEP 572 mess" was the topic of a 2018 Python Language Summit session led by benevolent dictator for life (BDFL) Guido van Rossum. PEP 572 seeks to add assignment expressions (or "inline assignments") to the language, but it has seen a prolonged discussion over multiple huge threads on the python-dev mailing list—even after multiple rounds on python-ideas. Those threads were often contentious and were clearly voluminous to the point where many probably just tuned them out. At the summit, Van Rossum gave an overview of the feature proposal, which he seems inclined toward accepting, but he also wanted to discuss how to avoid this kind of thread explosion in the future.

Assignments

Van Rossum said that he would try to summarize what he thinks the the controversy is all about, though he cautioned: "maybe we will find that it is something else". The basic idea behind the PEP is to have a way to do assignments in expressions, which will make writing some code constructs easier. C has this, as does Go, but the latter uses some extra syntax that he finds distasteful.

The problem with the C-style of assignments is that it leads to this classic error:

    if (x = 0)
        ...
That is legal syntactically, but is probably not what the programmer wanted since it assigns zero to x (rather than testing it for equality to zero) and never executes the statement after the if. If you don't believe that is a real problem, Van Rossum said, just look at Yoda-style conditions that reverse the order of a condition so that it will cause a syntax error if = is used instead of ==:
    if (0 = x)
        ...

Python vowed to solve this problem in a different way. The original Python had a single "=" for both assignment and equality testing, as Tim Peters recently reminded him, but it used a different syntactic distinction to ensure that the C problem could not occur. Python has always "prided itself" on not giving any possible way to have that mistaken assignment problem without having to resort to tricks like Yoda style.

A classic example of where these kinds of assignments would be quite useful is in pattern matching:

    m = re.match(p1, line)
    if m:
        return m.group(1)
    else:
        m = re.match(p2, line)
        if m:
            return m.group(2)
        else:
            m = re.match(p3, line)
            ...
The proposed syntax in the PEP would use a new ":=" operator (which could be read as meaning "becomes"), so that a series of matches like the above could instead be:
    if m := re.match(p1, line):
        return m.group(1)
    elif m := re.match(p2, line):
        return m.group(2)
    elif m := re.match(p3, line):
        ...

Another motivating code pattern is the "loop and a half". It was once common for processing a file by line, but that has been solved by making file objects iterable; however other non-iterable interfaces still suffer from patterns like:

    line = f.readline()
    while line:
        ...  # process line
	line = f.readline()
or like this:
    while True:
        line = f.readline()
	if not line:
	    break
	... # process line
Either of those could be replaced with a much more clear and concise version using an assignment expression:
    while line := f.readline():
        ... # process line
Van Rossum said that he knows he has written loop-and-a-half code and did not get it right at times. The assignment expression makes the intent of the author clear, while the other two make readers of the code work harder to see what is going on.

Another example is with comprehensions (e.g. list, dictionary). Sometimes programmers value the conciseness of the comprehension to the point where they will call an expensive function twice. He has seen that kind of thing, even in the code of good programmers.

But Python has done pretty well for 28 years without this functionality. A lot of people have reacted to the idea—in various different ways. Part of what people were looking for was examples from real code, not toy examples that were generated to justify the PEP. Peters and others found realistic examples from their own code where the feature would make the code shorter and, more importantly, clearer, Van Rossum said. All of those examples were too long to fit on his slides, however.

Contentious debate

One of the reasons that the debate has been so contentious, he thinks, is that there are so many different syntactic variations that have been suggested. Here is a partial list of the possibilities discussed in the threads:

    NAME := expr
    expr -> NAME
    NAME <- expr
    expr {NAME}
    NAME = expr
    expr2 where NAME = expr1
    let NAME = expr1 in expr2
    ...
As can be seen, some used new operators, others used keywords, and so on. Van Rossum said that he had tried to push C-style assignment to see how far it would go, but others were pushing their own variants. Beyond that, there were some different options that were discussed, including requiring parentheses, different precedence levels for the operator, allowing targets other than a simple name (e.g. obj.attr or a[i]), and restricting the construct to if, elif, and while.

[Guido van Rossum]

Another contentious issue was the idea of sub-local scopes that got mixed into the PEP early on. The idea is to have implicit scopes that are only active during the execution of a statement; it is potentially useful, but there are some quirks and corner cases. In the end, it got scratched from the PEP.

Overall, the idea has been "incredibly controversial", he said. What one person thinks is more readable, another person thinks is less readable. The benefits are moderate and everyone has their own favorite syntax. Sub-local scope added other oddities and would have required new bytecodes in order to implement it.

The PEP also bundled a fix for another problem, which is a "weird corner case" in comprehensions at class scope. That should be removed from PEP 572 and turned into its own PEP, he said.

A poll was taken on PEP 572, but the additional corner-case fix was part of the PEP. That muddied the poll, since those who wanted the assignment feature but did not want (or weren't sure of) the comprehension fix did not have a way to vote; a new poll will need to be done. The PEP moved to python-dev prematurely, as well.

Python is not a democracy, Van Rossum said. But generally folks agree with his decisions "except when I don't accept [their] favorite change".

Mark Shannon wondered if the attendees of the Python Education Summit might have some thoughts on the feature. Van Rossum acknowledged that some have said the feature makes it harder to teach Python, but he is not really sure of that, in part because he does not know how people learn the language. Nick Coghlan said the problem is trying to describe the difference between = and :=, but Van Rossum suggested that teachers not use := in instructional code. However, he does recognize that sites like Stack Overflow will lead some newbies to copy code in ways that might be confusing or wrong.

Decision-making

The larger issue from this PEP is "how we make decisions", Van Rossum said. There were many long responses in the threads, mostly against the feature. Overall, there was "way too much email". There were many misunderstandings, digressions, explanations, both right and wrong, and so on. Part of the problem is that there is no real way to measure the effectiveness of new language features.

In the end, he had to stop reading the threads so he wouldn't "go insane". Chris Angelico, who is the author of the PEP, could not be at the summit, but Van Rossum suggested that he stop responding in the threads to try to tamp things down. He wondered how to "dig our way out" of situations like this. It got to the point where people were starting new threads in order to try to get the attention of those who had muted older threads with too many messages.

Łukasz Langa suggested that "dictators should dictate"; Van Rossum should perhaps use his role to put a stop to some of that kind of stuff. But if not, then Van Rossum may just have to defer and stop following the threads, as he did. Langa said that he never follows python-ideas for exactly this reason.

Van Rossum said that the PEP had four revisions that were discussed on python-ideas before moving it to python-dev; he "thought we had it right". Langa wondered if there were other PEPs with a similar kind of response. Static typing (also known as "type hints") is one that Van Rossum remembered. Shannon thought that did not have as many negative postings from core developers as PEP 572 has had. Van Rossum agreed that might be the case but did remember a few core developers in opposition to type hints as well.

Victor Stinner suggested that the python-ideas discussion be summarized in the PEP. Van Rossum said that he thought many who responded had not read the discussion section in the PEP at all. He noted that the python-ideas discussion was better than the one on python-dev, even though it too had lots of passionate postings. There are fewer people following python-ideas, Christian Heimes said. Van Rossum wondered if the opposition only got heated up after he got involved; people may not have taken it seriously earlier because they thought he would not go for it.

Ned Deily suggested that the pattern for summit discussions be used to limit how long a discussion goes on; perhaps give five days before a decision will be made. The Tcl project has a much more formal process, where core developers are required to vote on proposals, but he didn't know if the Python project wanted to go down that path. It might make sense to have someone manage the conversation for PEPs, Van Rossum said. He is familiar with the IETF process from the late 1990s, which had some of that. He actually borrowed from the IETF to establish the PEP process.

But Barry Warsaw believes that PEP 572 is an outlier. Since it changes the syntax of the language, people tend to focus on that without understanding the deeper semantic issues. He suggested that perhaps a small group in addition to the PEP author could shepherd these kinds of PEPs. But in the end, people will keep discussing it until a pronouncement is made on the PEP one way or the other.

Van Rossum said that he is generally conflict-averse; he prefers not to just use his BDFL powers to shut down a discussion. Angelico is somewhat new at writing PEPs of this sort; Van Rossum thinks that Angelico probably would not have kept pushing it if he and Peters had not jumped into the discussion. Steve Dower said that perhaps some PEPs could be sent back with a request to get some others to work with the author on it.

Brett Cannon pointed out that the PEP editors are not scrutinizing PEPs super closely before they move to python-dev; it is mostly a matter of making sure there are no huge problems with the text. It might make sense to have a working group that tried to ensure the PEP was in the right state for a quality discussion. Another idea would be to have a senior co-author on PEPs of this nature, Van Rossum said. In addition to being an expert on the subject matter of the PEP, they could use their authority to help steer the conversation.


Index entries for this article
ConferencePython Language Summit/2018
PythonDevelopment model
PythonInline assignments
PythonPEP 572


(Log in to post comments)

PEP 572 and decision-making in Python

Posted Jun 20, 2018 18:59 UTC (Wed) by k8to (guest, #15413) [Link] (4 responses)

It's another in a long line of python mistakes, making the language more complicated for very minor benefit.

If you want to handle pattern match better, then add a pattern match construction. That would have a lot of power, clarity and efficiency of expression. Inline assignments let you make a lot of things less explicit with very small gains in efficiency of representation, no matter how you spell them.

PEP 572 and decision-making in Python

Posted Jun 21, 2018 0:54 UTC (Thu) by dw (subscriber, #12017) [Link]

Not just added complication, but added incompatibility. The language has barely shifted in productivity since 2.3-2.5 era (of course this could be debated), yet maintaining compatibility with even 5 year old installs is nigh impossible given the continuous "feature" additions

PEP 572 and decision-making in Python

Posted Jun 21, 2018 7:41 UTC (Thu) by epa (subscriber, #39769) [Link] (2 responses)

I think it's more than that: the division between expressions and statements runs deep in Python, and makes it different from languages like C, where there is not such a great difference between the two. For example take a list comprehension
a = 1
b = 2
[x+1 for x in a, b]
That works because x+1 is an expression. On the other hand, x=1 is a statement, so cannot appear there. That means you don't have to consider the semantics of how to assign to each list element, and whether a, b are lvalues or rvalues. Now, if an expression can also perform assignment (as in C), you could have
[x := 5 for x in a, b]
Should this modify the values of a and b in the local scope? Should it make temporary copies of these values, assign 5 to them, and then return them without modifying the originals? Or should it fail at run time with an error that a is not modifiable?

PEP 572 and decision-making in Python

Posted Jun 22, 2018 15:59 UTC (Fri) by k8to (guest, #15413) [Link] (1 responses)

I don't see how this scenario is a question. All variables in python are references, so assigning 5 to x never changes a or b ever.

PEP 572 and decision-making in Python

Posted Jun 22, 2018 21:34 UTC (Fri) by epa (subscriber, #39769) [Link]

All variables in python are references, so assigning 5 to x never changes a or b ever.
That's the doctrine -- but as I noted, the language is structured so that the question can't even arise. Perhaps a better example would be
a = 5
def foo():
    a = 6
    f = lambda x: a := 7
    return f
print(a)
f = foo()
print(a)
f(0)
print(a)
Inside the function foo() the first assignment a = 6 only affects a local variable a, not the outer one. But which a should be affected when you call f(0)? The one in the caller's scope or the one in scope where the lambda expression was declared?

PEP 572 and decision-making in Python

Posted Jun 20, 2018 21:01 UTC (Wed) by tbodt (subscriber, #120821) [Link] (2 responses)

The first example given could also be written like this:
m = re.match(p1, line)
if m:
    return m.group(1)
m = re.match(p2, line)
if m:
    return m.group(2)
m = re.match(p3, line)
if m:
    return m.group(3)
...

PEP 572 and decision-making in Python

Posted Jun 21, 2018 2:23 UTC (Thu) by em-bee (guest, #117037) [Link] (1 responses)

or like this?
for i in [(p1,1),(p2,2),(p3,3)]:
    return re.match(i[0], line).group(i[1])
greetings, eMBee.

PEP 572 and decision-making in Python

Posted Jun 21, 2018 2:33 UTC (Thu) by em-bee (guest, #117037) [Link]

(with added exception handling)

PEP 572 and decision-making in Python

Posted Jun 21, 2018 1:01 UTC (Thu) by IkeTo (subscriber, #2122) [Link] (7 responses)

I wonder why it cannot be made to be consistent with exception handling syntax and context manager syntax by using the "as" keyword. Like:
if re.match(p1, line) as m:
    return m.group(1)
elif re.match(p2, line) as m:
    return m.group(2)
elif re.match(p3, line) as m:
    ...
or
while f.readline() as line:
    ...  # process line

PEP 572 and decision-making in Python

Posted Jun 21, 2018 6:33 UTC (Thu) by k8to (guest, #15413) [Link]

If we must have inline assignments, this is at least consistent.

PEP 572 and decision-making in Python

Posted Jun 21, 2018 14:30 UTC (Thu) by smurf (subscriber, #17840) [Link] (4 responses)

You can rewrite the readline example to use a for loop, with a small generator helper:

def as_loop(fn, *args):
    while True:
        res = fn(*args)
        if not res:
            return
        yield res
…
f = open(…)
for line in as_loop(f.readline):
    …

assuming that you're opposed to the trivial rewrite of

while True:
    line = f.readline()
    if not line:
        break
    …

which I personally prefer.

PEP 572 and decision-making in Python

Posted Jun 21, 2018 16:45 UTC (Thu) by gdiscry (subscriber, #91125) [Link] (2 responses)

You don't even have to implement a new function, it already exists:

with open(…) as f:
    for line in iter(f.readline, ''):
        …

PEP 572 and decision-making in Python

Posted Jul 13, 2018 19:25 UTC (Fri) by gdamjan (subscriber, #33634) [Link] (1 responses)

the default iterator of python files actually generates lines
>>> fp = open('/etc/os-release')
>>> next(fp)
'NAME="Arch Linux"\n'

PEP 572 and decision-making in Python

Posted Jul 13, 2018 22:14 UTC (Fri) by gdiscry (subscriber, #91125) [Link]

That's the issue with toy examples like mine and the ones in the article. If it's a common pattern there's a pretty good chance that you can do it in a simple, optimized and readable way. And then the reader misses the point because the syntax specific to the common case doesn't apply to more complex code.

A better example for iter would be to read a binary file by chunk using for chunk in iter(lambda: f.read(CHUNK_SIZE), b''):. To my knowledge, there isn't a ready made function or method that does the same, contrary to file.readline and file.__iter__.

We can also see that the code is slightly less readable than the readline example. Furthermore, the complexity increases even more once the stop condition cannot be expressed as a simple equality to a sentinel value.

I have to admit that I find while chunk := f.read(CHUNK_SIZE): more readable than the other ways to do it and it looks like the readability remains good even in more complex cases.

PEP 572 and decision-making in Python

Posted Jun 22, 2018 16:02 UTC (Fri) by k8to (guest, #15413) [Link]

In this case, I use the while True, but i've used the generator helper in scenarios where the while True was awkward. I've gotten challenged on it as being too exotic/weird though. Maybe they were right?

PEP 572 and decision-making in Python

Posted Jun 24, 2018 23:53 UTC (Sun) by ewen (subscriber, #4772) [Link]

I do miss "assign and test for truthiness" at times in Python (especially re.match, and loops over functions returning content until EOF, etc), but also dislike the bugs this can introduce in C code. Reusing the exception handling / context manager syntax ("... FUNCTION_OUTPUT as VAR") seems like an ideal solution to both problems to me, as it's impossible to confuse with "oh, I meant to compare values", it's consistent with other Python syntax which helps readability, and it is still almost as concise as the other variations being suggested (:=, etc).

In addition the "... FUNCTION_OUTPUT as VAR" would also trivially allow treating that specific VAR as block scoped (eg, as it is implicitly is a context manager / exception handler) without surprising anyone that happened. As with other Python scoping, if the variable already existed earlier, it could update the outer scoped variable instead of creating a new block scoped one.

Good suggestion!

Ewen

PEP 572 and decision-making in Python

Posted Jun 21, 2018 5:10 UTC (Thu) by marcH (subscriber, #57642) [Link]

> But Barry Warsaw believes that PEP 572 is an outlier. Since it changes the syntax of the language, people tend to focus on that without understanding the deeper semantic issues.

Would it have helped to decouple the two (or three, four...) questions and proceed in incremental stages? I mean discussing and voting incomplete-by-design PEPs like: 1. semantics; 2. syntax; 3. lex. Earlier PEPs could be approved even with abstract/incomplete content like for instance this:

if ( x :TBD= 5)

Yet more evidence for Wadler's law

Posted Jun 28, 2018 21:00 UTC (Thu) by HelloWorld (guest, #56129) [Link] (16 responses)


In any language design, the total time spent discussing
a feature in this list is proportional to two raised to
the power of its position.
0. Semantics
1. Syntax
2. Lexical syntax
3. Lexical syntax of comments

Of course the real problem here is not the discussion but Python's broken language design. John McCarthy figured out in 1958 that the artifical separation of statements and expressions is completely unnecessary, and yet Van Rossum felt it necessary to make that mistake again 40 years later.

Yet more evidence for Wadler's law

Posted Jun 29, 2018 12:53 UTC (Fri) by renox (guest, #23785) [Link] (15 responses)

> Of course the real problem here is not the discussion but Python's broken language design. John McCarthy figured out in 1958 that the artifical separation of statements and expressions is completely unnecessary, and yet Van Rossum felt it necessary to make that mistake again 40 years later.

That's funny: C's assignment operator being an expression instead of a function is viewed as a source of errors: if (toto = FOO) instead of if (toto == FOO),
which creates ugly things like Yoda speak if (FOO == toto) or the non-standardized (but less ugly) "double parenthesis" pattern.

Yet more evidence for Wadler's law

Posted Jun 29, 2018 13:17 UTC (Fri) by adobriyan (subscriber, #30858) [Link]

It is hard to typo SETF into EQ or =. But it is very easy to typo '==' into "=".

Python has different operators for bitwise and logical operations which C should copy (already copied with iso646.h except if you try to use them, men will stop shaking hands with you).

Yet more evidence for Wadler's law

Posted Jun 29, 2018 13:25 UTC (Fri) by excors (subscriber, #95769) [Link]

Isn't that largely solved by modern compilers producing warnings in that case? (or in Java by making it a compile error, except in the unlikely case that the variable is a boolean). Personally I haven't seen it be a significantly common source of bugs, compared to the dozens of other ways that bugs can be introduced by small syntax errors, so it doesn't seem worth hobbling the whole language just for that.

Yet more evidence for Wadler's law

Posted Jun 29, 2018 14:38 UTC (Fri) by nybble41 (subscriber, #55106) [Link] (11 responses)

> C's assignment operator being an expression instead of a function is viewed as a source of errors

The errors are not due to assignment being an expression rather than a statement. To prevent assignment from being used in a context where a value is expected the result type of an assignment could simply be defined as void, while still treating it as an expression. The real issue, though, is the similarity between '=' and '==' and the fact that '=' is commonly used in math and elsewhere to represent equality, not assignment. Simply changing the names to '=' for equality and something like ':=' for assignment would have eliminated the issue without any change in semantics.

Yet more evidence for Wadler's law

Posted Jun 29, 2018 15:00 UTC (Fri) by renox (guest, #23785) [Link] (1 responses)

> To prevent assignment from being used in a context where a value is expected the result type of an assignment could simply be defined as void,

You're splitting hair, the different between a statement and a function which will return always void..

Yet more evidence for Wadler's law

Posted Jun 29, 2018 17:27 UTC (Fri) by nybble41 (subscriber, #55106) [Link]

> You're splitting hair, the different between a statement and a function which will return always void..

The difference is significant in terms of language design. Unification of statements and expressions does not imply that all expressions must produce a value, any more than a function call—which is always considered an expression in C—must produce a value. The point is merely to avoid having two distinct kinds of syntax. Instead of "statements" and "expressions", where statements can include expressions but not vice-versa, you'd simply have "expressions which return a usable value" and "expressions which return void". A function body would just be a single expression to be evaluated.

Add to that treating 'void' as a standard type with exactly one possible value (and thus no runtime representation), suitable for declaring variables, fields, parameters, etc., and some sort of local variable-binding expression similar to LISP's 'let' form, and you enable much more straightforward and expressive generic programming which currently can only be achieved through nonstandard extensions such as GCC's statement-expressions and __builtin_choose_expr() / __builtin_types_compatible_p().

Yet more evidence for Wadler's law

Posted Jun 29, 2018 15:08 UTC (Fri) by anselm (subscriber, #2796) [Link] (8 responses)

Simply changing the names to '=' for equality and something like ':=' for assignment would have eliminated the issue without any change in semantics.

That makes a lot of sense, especially with 20/20 hindsight. It's, however, just as well to remember that when C was invented, the method of choice to talk to your Unix machine (a PDP-11) would have been a 300-baud teletype printer. The original Unix developers were pragmatic people and they wanted to avoid superfluous keystrokes, hence ls and rm instead of list and remove, and, because C programs tend to contain way more assignments than equality comparisons, = for assignment and == for equality. (OTOH, Niklaus Wirth, who invented Pascal at about the same time, was not a pragmatist at all, so Pascal does have := for assignment and = for equality.)

Someone who came up with a new programming language today would probably not think twice about using “←” for assignment, which should eliminate the nasty ambiguity. But the heritage of the 300-baud teletype is still with us today and unlikely to go away anytime soon.

Yet more evidence for Wadler's law

Posted Jun 30, 2018 7:36 UTC (Sat) by HelloWorld (guest, #56129) [Link] (1 responses)

I don't buy that at all. A single additional character per assignment is very unlikely to be a problem, even on a 300-baud tty.

Yet more evidence for Wadler's law

Posted Jun 30, 2018 12:41 UTC (Sat) by anselm (subscriber, #2796) [Link]

The convention of = as the assignment operator and == as the equality operator actually arose when Ken Thompson designed the B programming language, the predecessor of C. B in turn is derived from Martin Richards' programming language, BCPL, which does use := for assignment, but one of Thompson's goals when designing B was apparently “reducing the number of non-whitespace characters in a typical program” [Wikipedia article on B].

Yet more evidence for Wadler's law

Posted Jul 8, 2018 15:12 UTC (Sun) by nix (subscriber, #2304) [Link] (5 responses)

> Someone who came up with a new programming language today would probably not think twice about using “←” for assignment

The lesson of B and Z: if your wonderful new language uses lots of symbols that aren't on people's keyboards, uptake will be slow. (Though editors could translate <- into ←, one wonders why you didn't just use <- in the first place and avoid this probably-nearly-universal difficulty.)

(Mind you, a bigger lesson of B: if you ring-fence a language around with copyrights and everything else you can think of, and allow only one implementation on one platform with no FFI facilities, you can expect not too terribly many people to take it up...)

Yet more evidence for Wadler's law

Posted Jul 13, 2018 0:36 UTC (Fri) by zblaxell (subscriber, #26385) [Link] (2 responses)

> Though editors could translate <- into ←, one wonders why you didn't just use <- in the first place and avoid this probably-nearly-universal difficulty.

Indeed, "←" is M-bM-^FM-^P, which is even worse than "<-" at 300 baud. Adoption would be slow for the first 15 years while the C development community waited for Unicode to be invented.

Yet more evidence for Wadler's law

Posted Jul 13, 2018 6:12 UTC (Fri) by zdzichu (subscriber, #17118) [Link] (1 responses)

It's RightAlt+y on my keyboard layout in Linux (Polish).

Yet more evidence for Wadler's law

Posted Jul 19, 2018 16:52 UTC (Thu) by mina86 (guest, #68442) [Link]

Weird, my Polish layout has ‘ü’ there. ;)

Yet more evidence for Wadler's law

Posted Jul 13, 2018 10:47 UTC (Fri) by nix (subscriber, #2304) [Link]

(Note for clarity: I'm not talking about Thompson's B here, but Abrial's B: <https://en.wikipedia.org/wiki/B-Method>. Whether it was only ever visibly used on French safety-critical systems because it was a formal method, because it was ring-fenced, and had only one implementation, or because like Z it used insane numbers of unprounceable symbols that made it really hard to actually talk about the programs you were writing, I'm not sure. Heck it might just be because it was French and your average Silicon Valley VC doesn't speak much French...)

Yet more evidence for Wadler's law

Posted Jul 13, 2018 19:07 UTC (Fri) by ErikF (subscriber, #118131) [Link]

"<-" has the same problem as the compound assignment operators in early versions of C (i.e. "=+", "=-", etc.): it's ambiguous in high-traffic places. How would you then do a comparison like "a<-b"?

Yet more evidence for Wadler's law

Posted Jun 29, 2018 22:59 UTC (Fri) by HelloWorld (guest, #56129) [Link]

> That's funny: C's assignment operator being an expression instead of a function is viewed as a source of errors: if (toto = FOO) instead of if (toto == FOO)
The problem here isn't that the assignment is an expression but that is has the type of the left operand. If assignment expressions had type void, you couldn't make that mistake.

PEP 572 and decision-making in Python

Posted Jul 13, 2018 2:07 UTC (Fri) by OrbatuThyanD (guest, #114326) [Link]

having spent 18 months pushing through an incredibly inconsequential pep that got bike-shedded to death (eventually accepted, you python 3.2+ folks are potentially benefiting), i'm oddly not surprised that guido is quitting as bdfl after this. dealing with the python devs on that pep made me never want to write python again.


Copyright © 2018, Eklektix, Inc.
This article may be redistributed under the terms of the Creative Commons CC BY-SA 4.0 license
Comments and public postings are copyrighted by their creators.
Linux is a registered trademark of Linus Torvalds