The code comes from Lib/_pyio.py. Simplified code: --- nodata_val = b"" ... if n is None or n == -1: ... current_size = 0 while True: chunk = self.raw.read() if chunk in empty_values: nodata_val = chunk break current_size += len(chunk) chunks.append(chunk) return b"".join(chunks) or nodata_val ... while avail < n: chunk = self.raw.read(wanted) if chunk in empty_values: nodata_val = chunk break avail += len(chunk) chunks.append(chunk) ... return out[:n] if out else nodata_val --- It seems like "nodata_val = " assignment can be moved out of the first loop, but cannot be moved for the second loop (since the second loop has no iteration if "avail >= n"). Yeah, maybe for this specific file, assignment expressions could be used for the (C) case and would be worth it. Victor 2018-07-05 1:49 GMT+02:00 MRAB <python at mrabarnett.plus.com>: > On 2018-07-04 23:51, Victor Stinner wrote: > [snip] >> >> (C) >> >> while True: >> chunk = self.raw.read() >> if chunk in empty_values: >> nodata_val = chunk >> break >> ... >> >> "nodata_val = chunk" cannot be put into the "chunk := self.raw.read()" >> assignment expression combined with a test. At least, I don't see how. >> > If that's the only 'break' in the loop, then you know that 'chunk' will have > an 'empty' value after the loop, so you can change it to: > > while True: > chunk = self.raw.read() > if chunk in empty_values: > break > ... > nodata_val = chunk > > which then leads to: > > while (chunk := self.raw.read()) not in empty_values: > ... > nodata_val = chunk > > [snip] > _______________________________________________ > Python-Dev mailing list > Python-Dev at python.org > https://mail.python.org/mailman/listinfo/python-dev > Unsubscribe: > https://mail.python.org/mailman/options/python-dev/vstinner%40redhat.com
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4