]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-45975: Simplify some while-loops with walrus operator (GH-29347)
authorNick Drozd <nicholasdrozd@gmail.com>
Sat, 26 Nov 2022 22:33:25 +0000 (16:33 -0600)
committerGitHub <noreply@github.com>
Sat, 26 Nov 2022 22:33:25 +0000 (14:33 -0800)
28 files changed:
Lib/_pyio.py
Lib/base64.py
Lib/ctypes/_aix.py
Lib/email/parser.py
Lib/ftplib.py
Lib/http/client.py
Lib/http/cookiejar.py
Lib/mailbox.py
Lib/mailcap.py
Lib/mimetypes.py
Lib/pstats.py
Lib/pydoc.py
Lib/quopri.py
Lib/shlex.py
Lib/shutil.py
Lib/smtplib.py
Lib/socketserver.py
Lib/tarfile.py
Lib/test/test_lzma.py
Lib/urllib/request.py
Lib/wsgiref/handlers.py
Lib/wsgiref/validate.py
Lib/xdrlib.py
Lib/xml/dom/expatbuilder.py
Lib/xml/etree/ElementTree.py
Lib/xml/sax/xmlreader.py
Lib/xmlrpc/client.py
Lib/xmlrpc/server.py

index 163cf9de279ff05a42bc92f90c926c4f1c5137c2..7f247ff47c9e61e51924d24d520b64e6fbe60d26 100644 (file)
@@ -638,10 +638,7 @@ class RawIOBase(IOBase):
     def readall(self):
         """Read until EOF, using multiple read() call."""
         res = bytearray()
-        while True:
-            data = self.read(DEFAULT_BUFFER_SIZE)
-            if not data:
-                break
+        while data := self.read(DEFAULT_BUFFER_SIZE):
             res += data
         if res:
             return bytes(res)
index 30796a6fd6d05acad37fdc822680af73afadb626..95dc7b0086051b8b1dda107789ff7766ea708c4a 100755 (executable)
@@ -508,14 +508,8 @@ MAXBINSIZE = (MAXLINESIZE//4)*3
 
 def encode(input, output):
     """Encode a file; input and output are binary files."""
-    while True:
-        s = input.read(MAXBINSIZE)
-        if not s:
-            break
-        while len(s) < MAXBINSIZE:
-            ns = input.read(MAXBINSIZE-len(s))
-            if not ns:
-                break
+    while s := input.read(MAXBINSIZE):
+        while len(s) < MAXBINSIZE and (ns := input.read(MAXBINSIZE-len(s))):
             s += ns
         line = binascii.b2a_base64(s)
         output.write(line)
@@ -523,10 +517,7 @@ def encode(input, output):
 
 def decode(input, output):
     """Decode a file; input and output are binary files."""
-    while True:
-        line = input.readline()
-        if not line:
-            break
+    while line := input.readline():
         s = binascii.a2b_base64(line)
         output.write(s)
 
index fc3e95cbcc88a530f08da216145675df65ff8864..ee790f713a9ee3a566c653e2f6b56f3c280c770d 100644 (file)
@@ -108,12 +108,8 @@ def get_ld_headers(file):
     p = Popen(["/usr/bin/dump", f"-X{AIX_ABI}", "-H", file],
         universal_newlines=True, stdout=PIPE, stderr=DEVNULL)
     # be sure to read to the end-of-file - getting all entries
-    while True:
-        ld_header = get_ld_header(p)
-        if ld_header:
-            ldr_headers.append((ld_header, get_ld_header_info(p)))
-        else:
-            break
+    while ld_header := get_ld_header(p):
+        ldr_headers.append((ld_header, get_ld_header_info(p)))
     p.stdout.close()
     p.wait()
     return ldr_headers
index 7db4da1ff081c1c66c1f0224d7543e68aa3b89a5..e94d455baa526220df23aac4c4da03a457cdc662 100644 (file)
@@ -49,10 +49,7 @@ class Parser:
         feedparser = FeedParser(self._class, policy=self.policy)
         if headersonly:
             feedparser._set_headersonly()
-        while True:
-            data = fp.read(8192)
-            if not data:
-                break
+        while data := fp.read(8192):
             feedparser.feed(data)
         return feedparser.close()
 
index c7ca8f632e1bd46d8f7b97bf3bc8264f44c53063..a56e0c3085701b8b8843abd43fa2baa9c37bc9c3 100644 (file)
@@ -434,10 +434,7 @@ class FTP:
         """
         self.voidcmd('TYPE I')
         with self.transfercmd(cmd, rest) as conn:
-            while 1:
-                data = conn.recv(blocksize)
-                if not data:
-                    break
+            while data := conn.recv(blocksize):
                 callback(data)
             # shutdown ssl layer
             if _SSLSocket is not None and isinstance(conn, _SSLSocket):
@@ -496,10 +493,7 @@ class FTP:
         """
         self.voidcmd('TYPE I')
         with self.transfercmd(cmd, rest) as conn:
-            while 1:
-                buf = fp.read(blocksize)
-                if not buf:
-                    break
+            while buf := fp.read(blocksize):
                 conn.sendall(buf)
                 if callback:
                     callback(buf)
index 0a3e950c66962275aeec24eaf350a1586ac71aae..15c5cf634cf50895c8c71482e1f175d0a6902363 100644 (file)
@@ -578,11 +578,7 @@ class HTTPResponse(io.BufferedIOBase):
         assert self.chunked != _UNKNOWN
         value = []
         try:
-            while True:
-                chunk_left = self._get_chunk_left()
-                if chunk_left is None:
-                    break
-
+            while (chunk_left := self._get_chunk_left()) is not None:
                 if amt is not None and amt <= chunk_left:
                     value.append(self._safe_read(amt))
                     self.chunk_left = chunk_left - amt
@@ -998,10 +994,7 @@ class HTTPConnection:
             encode = self._is_textIO(data)
             if encode and self.debuglevel > 0:
                 print("encoding file using iso-8859-1")
-            while 1:
-                datablock = data.read(self.blocksize)
-                if not datablock:
-                    break
+            while datablock := data.read(self.blocksize):
                 if encode:
                     datablock = datablock.encode("iso-8859-1")
                 sys.audit("http.client.send", self, datablock)
@@ -1031,10 +1024,7 @@ class HTTPConnection:
         encode = self._is_textIO(readable)
         if encode and self.debuglevel > 0:
             print("encoding file using iso-8859-1")
-        while True:
-            datablock = readable.read(self.blocksize)
-            if not datablock:
-                break
+        while datablock := readable.read(self.blocksize):
             if encode:
                 datablock = datablock.encode("iso-8859-1")
             yield datablock
index 65c45e2b17dfc01dd52ca566c70aae538f65f68a..b0161a86fdbb511eb1704792bf9bd481ee9963f7 100644 (file)
@@ -1915,9 +1915,7 @@ class LWPCookieJar(FileCookieJar):
                        "comment", "commenturl")
 
         try:
-            while 1:
-                line = f.readline()
-                if line == "": break
+            while (line := f.readline()) != "":
                 if not line.startswith(header):
                     continue
                 line = line[len(header):].strip()
@@ -2017,12 +2015,9 @@ class MozillaCookieJar(FileCookieJar):
                 filename)
 
         try:
-            while 1:
-                line = f.readline()
+            while (line := f.readline()) != "":
                 rest = {}
 
-                if line == "": break
-
                 # httponly is a cookie flag as defined in rfc6265
                 # when encoded in a netscape cookie file,
                 # the line is prepended with "#HttpOnly_"
index 70da07ed2e9e8bc18dfc26ac1762f4102bcf4426..59834a2b3b52434ccbc8bce7a2d35d8d74e72c04 100644 (file)
@@ -1956,10 +1956,7 @@ class _ProxyFile:
 
     def __iter__(self):
         """Iterate over lines."""
-        while True:
-            line = self.readline()
-            if not line:
-                return
+        while line := self.readline():
             yield line
 
     def tell(self):
index 7278ea7051fccf82d1b52521928ab3aa7a8f79d4..2f4656e854b3bbd2efe679a651d20dafed7f798b 100644 (file)
@@ -90,9 +90,7 @@ def _readmailcapfile(fp, lineno):
     the viewing command is stored with the key "view".
     """
     caps = {}
-    while 1:
-        line = fp.readline()
-        if not line: break
+    while line := fp.readline():
         # Ignore comments and blank lines
         if line[0] == '#' or line.strip() == '':
             continue
index 3224363a3f2bfb7617284ce140dd253a00cddef1..37228de4828de59e5052fc5d6eee40612c0ec59a 100644 (file)
@@ -217,10 +217,7 @@ class MimeTypes:
         list of standard types, else to the list of non-standard
         types.
         """
-        while 1:
-            line = fp.readline()
-            if not line:
-                break
+        while line := fp.readline():
             words = line.split()
             for i in range(len(words)):
                 if words[i][0] == '#':
index 80408313e8b27fccab728126e5b0aa4d7e2d24cf..51bcca8418874009bf1887aa0f3ce6b4ae528f3c 100644 (file)
@@ -223,8 +223,6 @@ class Stats:
             for word, tup in self.sort_arg_dict_default.items():
                 fragment = word
                 while fragment:
-                    if not fragment:
-                        break
                     if fragment in dict:
                         bad_list[fragment] = 0
                         break
index c79ec77a8c09e4aa5dfb84f57a5d4de91759afc4..0a693f45230c93d9eda770c0a7c1623f32eb7e28 100755 (executable)
@@ -686,9 +686,7 @@ class HTMLDoc(Doc):
                                 r'RFC[- ]?(\d+)|'
                                 r'PEP[- ]?(\d+)|'
                                 r'(self\.)?(\w+))')
-        while True:
-            match = pattern.search(text, here)
-            if not match: break
+        while match := pattern.search(text, here):
             start, end = match.span()
             results.append(escape(text[here:start]))
 
index 08899c5cb73a300d340ba2f84e25e82b249d3f55..f36cf7b3951cda76aa31564d3e70e1c734470e55 100755 (executable)
@@ -67,10 +67,7 @@ def encode(input, output, quotetabs, header=False):
             output.write(s + lineEnd)
 
     prevline = None
-    while 1:
-        line = input.readline()
-        if not line:
-            break
+    while line := input.readline():
         outline = []
         # Strip off any readline induced trailing newline
         stripped = b''
@@ -126,9 +123,7 @@ def decode(input, output, header=False):
         return
 
     new = b''
-    while 1:
-        line = input.readline()
-        if not line: break
+    while line := input.readline():
         i, n = 0, len(line)
         if n > 0 and line[n-1:n] == b'\n':
             partial = 0; n = n-1
index a91c9b022627b18580e5c78c7986cf0f38f479ac..f4821616b62a0fa82ef0354d4901761ab20f74cb 100644 (file)
@@ -333,10 +333,7 @@ def quote(s):
 
 
 def _print_tokens(lexer):
-    while 1:
-        tt = lexer.get_token()
-        if not tt:
-            break
+    while tt := lexer.get_token():
         print("Token: " + repr(tt))
 
 if __name__ == '__main__':
index f372406a6c51a80313941f48716aa50cb8ce8943..867925aa10cc044be3d6b8c940a66ac493d76b0c 100644 (file)
@@ -194,10 +194,7 @@ def copyfileobj(fsrc, fdst, length=0):
     # Localize variable access to minimize overhead.
     fsrc_read = fsrc.read
     fdst_write = fdst.write
-    while True:
-        buf = fsrc_read(length)
-        if not buf:
-            break
+    while buf := fsrc_read(length):
         fdst_write(buf)
 
 def _samefile(src, dst):
index 05d2f8ccd73c98e824604dd43d4277e134f061f5..18c91746fd7bf25a8905b9934e3366fc078bc950 100755 (executable)
@@ -1099,10 +1099,7 @@ if __name__ == '__main__':
     toaddrs = prompt("To").split(',')
     print("Enter message, end with ^D:")
     msg = ''
-    while 1:
-        line = sys.stdin.readline()
-        if not line:
-            break
+    while line := sys.stdin.readline():
         msg = msg + line
     print("Message length is %d" % len(msg))
 
index 30a5cfa59fe05ba55e252b9a78b710f56845d0a7..842d526b011911cc85eae01dcab081122475f032 100644 (file)
@@ -292,8 +292,7 @@ class BaseServer:
             selector.register(self, selectors.EVENT_READ)
 
             while True:
-                ready = selector.select(timeout)
-                if ready:
+                if selector.select(timeout):
                     return self._handle_request_noblock()
                 else:
                     if timeout is not None:
index b47015f5cb6be5166949e3b84087530b17b09c7a..d686435d90ad1bc7c597b164ac00157ed5ff41dc 100755 (executable)
@@ -1262,11 +1262,7 @@ class TarInfo(object):
         # the newline. keyword and value are both UTF-8 encoded strings.
         regex = re.compile(br"(\d+) ([^=]+)=")
         pos = 0
-        while True:
-            match = regex.match(buf, pos)
-            if not match:
-                break
-
+        while match := regex.match(buf, pos):
             length, keyword = match.groups()
             length = int(length)
             if length == 0:
@@ -2418,10 +2414,8 @@ class TarFile(object):
         """Read through the entire archive file and look for readable
            members.
         """
-        while True:
-            tarinfo = self.next()
-            if tarinfo is None:
-                break
+        while self.next() is not None:
+            pass
         self._loaded = True
 
     def _check(self, mode=None):
index 145c8cfced4080bd99c72d121ac2c4e9164b9cbd..18f474ba2a8bdc4f409ec9390becdf83793fe30c 100644 (file)
@@ -825,10 +825,7 @@ class FileTestCase(unittest.TestCase):
     def test_read_10(self):
         with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
             chunks = []
-            while True:
-                result = f.read(10)
-                if not result:
-                    break
+            while result := f.read(10):
                 self.assertLessEqual(len(result), 10)
                 chunks.append(result)
             self.assertEqual(b"".join(chunks), INPUT)
@@ -911,10 +908,7 @@ class FileTestCase(unittest.TestCase):
     def test_read1(self):
         with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
             blocks = []
-            while True:
-                result = f.read1()
-                if not result:
-                    break
+            while result := f.read1():
                 blocks.append(result)
             self.assertEqual(b"".join(blocks), INPUT)
             self.assertEqual(f.read1(), b"")
@@ -926,10 +920,7 @@ class FileTestCase(unittest.TestCase):
     def test_read1_10(self):
         with LZMAFile(BytesIO(COMPRESSED_XZ)) as f:
             blocks = []
-            while True:
-                result = f.read1(10)
-                if not result:
-                    break
+            while result := f.read1(10):
                 blocks.append(result)
             self.assertEqual(b"".join(blocks), INPUT)
             self.assertEqual(f.read1(), b"")
@@ -937,10 +928,7 @@ class FileTestCase(unittest.TestCase):
     def test_read1_multistream(self):
         with LZMAFile(BytesIO(COMPRESSED_XZ * 5)) as f:
             blocks = []
-            while True:
-                result = f.read1()
-                if not result:
-                    break
+            while result := f.read1():
                 blocks.append(result)
             self.assertEqual(b"".join(blocks), INPUT * 5)
             self.assertEqual(f.read1(), b"")
index 278aa3a14bfeea00d051d081e4af11d1f1fc2af3..151034e6a81bf92b5a59d92d6b00596781d106c0 100644 (file)
@@ -265,10 +265,7 @@ def urlretrieve(url, filename=None, reporthook=None, data=None):
             if reporthook:
                 reporthook(blocknum, bs, size)
 
-            while True:
-                block = fp.read(bs)
-                if not block:
-                    break
+            while block := fp.read(bs):
                 read += len(block)
                 tfp.write(block)
                 blocknum += 1
@@ -1847,10 +1844,7 @@ class URLopener:
                     size = int(headers["Content-Length"])
                 if reporthook:
                     reporthook(blocknum, bs, size)
-                while 1:
-                    block = fp.read(bs)
-                    if not block:
-                        break
+                while block := fp.read(bs):
                     read += len(block)
                     tfp.write(block)
                     blocknum += 1
index cd0916dc5553fbc00f2835be61930f5f21746b72..cafe872c7aae9b04ec505b338735b50a2f12a2b6 100644 (file)
@@ -475,10 +475,7 @@ class SimpleHandler(BaseHandler):
         from warnings import warn
         warn("SimpleHandler.stdout.write() should not do partial writes",
             DeprecationWarning)
-        while True:
-            data = data[result:]
-            if not data:
-                break
+        while data := data[result:]:
             result = self.stdout.write(data)
 
     def _flush(self):
index 6044e320a474c644820a95a52d94de90fa10797a..1a1853cd63a0d2aedcdb93e5f692040e48c9092e 100644 (file)
@@ -214,10 +214,7 @@ class InputWrapper:
         return lines
 
     def __iter__(self):
-        while 1:
-            line = self.readline()
-            if not line:
-                return
+        while line := self.readline():
             yield line
 
     def close(self):
index b56ffa59b73dcba1241ba0b181f2dd593389945a..f8c2c18228da4d969b789ff11916a006b8d571e3 100644 (file)
@@ -224,9 +224,7 @@ class Unpacker:
 
     def unpack_list(self, unpack_item):
         list = []
-        while 1:
-            x = self.unpack_uint()
-            if x == 0: break
+        while (x := self.unpack_uint()) != 0:
             if x != 1:
                 raise ConversionError('0 or 1 expected, got %r' % (x,))
             item = unpack_item()
index 199c22d0af347e15bf53005f74b5359ce0f0e904..7dd667bf3fbe042d8d14ff1d07541cf52dc8f333 100644 (file)
@@ -200,10 +200,7 @@ class ExpatBuilder:
         parser = self.getParser()
         first_buffer = True
         try:
-            while 1:
-                buffer = file.read(16*1024)
-                if not buffer:
-                    break
+            while buffer := file.read(16*1024):
                 parser.Parse(buffer, False)
                 if first_buffer and self.document.documentElement:
                     self._setup_subset(buffer)
index ebbe2b703bfd8fc7d02a85cb2771591708f30461..df5d5191126ae10f3ebffb49b38831ddc77e046b 100644 (file)
@@ -566,10 +566,7 @@ class ElementTree:
                     # it with chunks.
                     self._root = parser._parse_whole(source)
                     return self._root
-            while True:
-                data = source.read(65536)
-                if not data:
-                    break
+            while data := source.read(65536):
                 parser.feed(data)
             self._root = parser.close()
             return self._root
index 716f22840414e604ab38661f91eb07f094309833..e906121d23b9ef31d3071475e7b6c7246d393103 100644 (file)
@@ -120,10 +120,8 @@ class IncrementalParser(XMLReader):
         file = source.getCharacterStream()
         if file is None:
             file = source.getByteStream()
-        buffer = file.read(self._bufsize)
-        while buffer:
+        while buffer := file.read(self._bufsize):
             self.feed(buffer)
-            buffer = file.read(self._bufsize)
         self.close()
 
     def feed(self, data):
index bef23f4505e03c9ff2e61337ca4ff44ce508dbfc..ea8da766cb5a7e00559c3b8392402acaf815184b 100644 (file)
@@ -1339,10 +1339,7 @@ class Transport:
 
         p, u = self.getparser()
 
-        while 1:
-            data = stream.read(1024)
-            if not data:
-                break
+        while data := stream.read(1024):
             if self.verbose:
                 print("body:", repr(data))
             p.feed(data)
index 0c4b558045a9f43b022f4c025063a47f7b4caff3..4dddb1d10e08bd9b6eb8e70a3bced2c8c9cdbde5 100644 (file)
@@ -720,9 +720,7 @@ class ServerHTMLDoc(pydoc.HTMLDoc):
                                 r'RFC[- ]?(\d+)|'
                                 r'PEP[- ]?(\d+)|'
                                 r'(self\.)?((?:\w|\.)+))\b')
-        while 1:
-            match = pattern.search(text, here)
-            if not match: break
+        while match := pattern.search(text, here):
             start, end = match.span()
             results.append(escape(text[here:start]))