summaryrefslogtreecommitdiffstats
path: root/Doc/faq
diff options
context:
space:
mode:
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>2019-09-11 15:12:09 (GMT)
committerStéphane Wirtel <stephane@wirtel.be>2019-09-11 15:12:09 (GMT)
commitbe2aa58fdc29cf13aabff6d6712e7853e94e88f8 (patch)
tree94f6efa4530f61c3fa47db0fba627f505988f00f /Doc/faq
parente784bb7c6b2a52e80d7c03cb85e5faab11a1ccbd (diff)
downloadcpython-be2aa58fdc29cf13aabff6d6712e7853e94e88f8.zip
cpython-be2aa58fdc29cf13aabff6d6712e7853e94e88f8.tar.gz
cpython-be2aa58fdc29cf13aabff6d6712e7853e94e88f8.tar.bz2
bpo-35224: Additional documentation for Assignment Expressions (GH-15935) (GH-15967)
Add or update assignment expression documentation for: - FAQ - Design - Reference - Expressions - Reference - Lexical Analysis https://bugs.python.org/issue35224 Automerge-Triggered-By: @matrixise (cherry picked from commit 6357c95716d89ac1f80587fbc4133df8d2e8396c) Co-authored-by: Emily Morehouse <emily@cuttlesoft.com>
Diffstat (limited to 'Doc/faq')
-rw-r--r--Doc/faq/design.rst63
1 files changed, 6 insertions, 57 deletions
diff --git a/Doc/faq/design.rst b/Doc/faq/design.rst
index e2d63a0..81c0f47 100644
--- a/Doc/faq/design.rst
+++ b/Doc/faq/design.rst
@@ -149,66 +149,15 @@ to tell Python which namespace to use.
Why can't I use an assignment in an expression?
-----------------------------------------------
-Many people used to C or Perl complain that they want to use this C idiom:
+Starting in Python 3.8, you can!
-.. code-block:: c
+Assignment expressions using the walrus operator `:=` assign a variable in an
+expression::
- while (line = readline(f)) {
- // do something with line
- }
-
-where in Python you're forced to write this::
-
- while True:
- line = f.readline()
- if not line:
- break
- ... # do something with line
-
-The reason for not allowing assignment in Python expressions is a common,
-hard-to-find bug in those other languages, caused by this construct:
-
-.. code-block:: c
-
- if (x = 0) {
- // error handling
- }
- else {
- // code that only works for nonzero x
- }
-
-The error is a simple typo: ``x = 0``, which assigns 0 to the variable ``x``,
-was written while the comparison ``x == 0`` is certainly what was intended.
-
-Many alternatives have been proposed. Most are hacks that save some typing but
-use arbitrary or cryptic syntax or keywords, and fail the simple criterion for
-language change proposals: it should intuitively suggest the proper meaning to a
-human reader who has not yet been introduced to the construct.
-
-An interesting phenomenon is that most experienced Python programmers recognize
-the ``while True`` idiom and don't seem to be missing the assignment in
-expression construct much; it's only newcomers who express a strong desire to
-add this to the language.
-
-There's an alternative way of spelling this that seems attractive but is
-generally less robust than the "while True" solution::
-
- line = f.readline()
- while line:
- ... # do something with line...
- line = f.readline()
-
-The problem with this is that if you change your mind about exactly how you get
-the next line (e.g. you want to change it into ``sys.stdin.readline()``) you
-have to remember to change two places in your program -- the second occurrence
-is hidden at the bottom of the loop.
-
-The best approach is to use iterators, making it possible to loop through
-objects using the ``for`` statement. For example, :term:`file objects
-<file object>` support the iterator protocol, so you can write simply::
+ while chunk := fp.read(200):
+ print(chunk)
- for line in f:
- ... # do something with line...
+See :pep:`572` for more information.