[issue5734] Fix BufferedRWPair - Code Review (original) (raw)
OLD
NEW
1 """
1 """
2 Python implementation of the io module.
2 Python implementation of the io module.
3 """
3 """
4
4
5 import os
5 import os
6 import abc
6 import abc
7 import codecs
7 import codecs
8 import warnings
8 import warnings
9 # Import _thread instead of threading to reduce startup cost
9 # Import _thread instead of threading to reduce startup cost
10 try:
10 try:
(...skipping 349 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
360 if msg is None else msg)
360 if msg is None else msg)
361
361
362
362
363 def readable(self) -> bool:
363 def readable(self) -> bool:
364 """Return whether object was opened for reading.
364 """Return whether object was opened for reading.
365
365
366 If False, read() will raise IOError.
366 If False, read() will raise IOError.
367 """
367 """
368 return False
368 return False
369
369
370 def _checkReadable(self, msg=None):
371 """Internal: raise an IOError if file is not readable
372 """
373 if not self.readable():
374 raise IOError("File or stream is not readable."
375 if msg is None else msg)
376
377 def writable(self) -> bool:
370 def writable(self) -> bool:
378 """Return whether object was opened for writing.
371 """Return whether object was opened for writing.
379
372
380 If False, write() and truncate() will raise IOError.
373 If False, write() and truncate() will raise IOError.
381 """
374 """
382 return False
375 return False
383
376
384 def _checkWritable(self, msg=None):
385 """Internal: raise an IOError if file is not writable
386 """
387 if not self.writable():
388 raise IOError("File or stream is not writable."
389 if msg is None else msg)
390
391 @property
377 @property
392 def closed(self):
378 def closed(self):
393 """closed: bool. True iff the file has been closed.
379 """closed: bool. True iff the file has been closed.
394
380
395 For backwards compatibility, this is a property, not a predicate.
381 For backwards compatibility, this is a property, not a predicate.
396 """
382 """
397 return self.__closed
383 return self.__closed
398
384
399 def _checkClosed(self, msg=None):
385 def _checkClosed(self, msg=None):
400 """Internal: raise an ValueError if file is closed
386 """Internal: raise an ValueError if file is closed
(...skipping 430 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
831 A buffer for a readable, sequential BaseRawIO object.
817 A buffer for a readable, sequential BaseRawIO object.
832
818
833 The constructor creates a BufferedReader for the given readable raw
819 The constructor creates a BufferedReader for the given readable raw
834 stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE
820 stream and buffer_size. If buffer_size is omitted, DEFAULT_BUFFER_SIZE
835 is used.
821 is used.
836 """
822 """
837
823
838 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
824 def __init__(self, raw, buffer_size=DEFAULT_BUFFER_SIZE):
839 """Create a new buffered reader using the given readable raw IO object.
825 """Create a new buffered reader using the given readable raw IO object.
840 """
826 """
841 raw._checkReadable()
827
828 if not raw.readable():
829 raise IOError('"raw" argument must be readable.')
830
842 _BufferedIOMixin.__init__(self, raw)
831 _BufferedIOMixin.__init__(self, raw)
843 if buffer_size <= 0:
832 if buffer_size <= 0:
844 raise ValueError("invalid buffer size")
833 raise ValueError("invalid buffer size")
845 self.buffer_size = buffer_size
834 self.buffer_size = buffer_size
846 self._reset_read_buf()
835 self._reset_read_buf()
847 self._read_lock = Lock()
836 self._read_lock = Lock()
848
837
849 def _reset_read_buf(self):
838 def _reset_read_buf(self):
850 self._read_buf = b""
839 self._read_buf = b""
851 self._read_pos = 0
840 self._read_pos = 0
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
962
951
963 The constructor creates a BufferedWriter for the given writeable raw
952 The constructor creates a BufferedWriter for the given writeable raw
964 stream. If the buffer_size is not given, it defaults to
953 stream. If the buffer_size is not given, it defaults to
965 DEFAULT_BUFFER_SIZE.
954 DEFAULT_BUFFER_SIZE.
966 """
955 """
967
956
968 _warning_stack_offset = 2
957 _warning_stack_offset = 2
969
958
970 def __init__(self, raw,
959 def __init__(self, raw,
971 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
960 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
972 raw._checkWritable()
961
962 if not raw.writable():
963 raise IOError('"raw" argument must be writable.')
964
973 _BufferedIOMixin.__init__(self, raw)
965 _BufferedIOMixin.__init__(self, raw)
974 if buffer_size <= 0:
966 if buffer_size <= 0:
975 raise ValueError("invalid buffer size")
967 raise ValueError("invalid buffer size")
976 if max_buffer_size is not None:
968 if max_buffer_size is not None:
977 warnings.warn("max_buffer_size is deprecated", DeprecationWarning,
969 warnings.warn("max_buffer_size is deprecated", DeprecationWarning,
978 self._warning_stack_offset)
970 self._warning_stack_offset)
979 self.buffer_size = buffer_size
971 self.buffer_size = buffer_size
980 self._write_buf = bytearray()
972 self._write_buf = bytearray()
981 self._write_lock = Lock()
973 self._write_lock = Lock()
982
974
(...skipping 85 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
1068 # objects) is questionable.
1060 # objects) is questionable.
1069
1061
1070 def __init__(self, reader, writer,
1062 def __init__(self, reader, writer,
1071 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
1063 buffer_size=DEFAULT_BUFFER_SIZE, max_buffer_size=None):
1072 """Constructor.
1064 """Constructor.
1073
1065
1074 The arguments are two RawIO instances.
1066 The arguments are two RawIO instances.
1075 """
1067 """
1076 if max_buffer_size is not None:
1068 if max_buffer_size is not None:
1077 warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2 )
1069 warnings.warn("max_buffer_size is deprecated", DeprecationWarning, 2 )
1078 reader._checkReadable()
1070
1079 writer._checkWritable()
1071 if not reader.readable():
1072 raise IOError('"reader" argument must be readable.')
1073
1074 if not writer.writable():
1075 raise IOError('"writer" argument must be writable.')
1076
1080 self.reader = BufferedReader(reader, buffer_size)
1077 self.reader = BufferedReader(reader, buffer_size)
1081 self.writer = BufferedWriter(writer, buffer_size)
1078 self.writer = BufferedWriter(writer, buffer_size)
1082
1079
1083 def read(self, n=None):
1080 def read(self, n=None):
1084 if n is None:
1081 if n is None:
1085 n = -1
1082 n = -1
1086 return self.reader.read(n)
1083 return self.reader.read(n)
1087
1084
1088 def readinto(self, b):
1085 def readinto(self, b):
1089 return self.reader.readinto(b)
1086 return self.reader.readinto(b)
(...skipping 600 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
1690 self._snapshot = (dec_flags, input_chunk)
1687 self._snapshot = (dec_flags, input_chunk)
1691
1688
1692 # Skip chars_to_skip of the decoded characters.
1689 # Skip chars_to_skip of the decoded characters.
1693 if len(self._decoded_chars) < chars_to_skip:
1690 if len(self._decoded_chars) < chars_to_skip:
1694 raise IOError("can't restore logical file position")
1691 raise IOError("can't restore logical file position")
1695 self._decoded_chars_used = chars_to_skip
1692 self._decoded_chars_used = chars_to_skip
1696
1693
1697 return cookie
1694 return cookie
1698
1695
1699 def read(self, n=None):
1696 def read(self, n=None):
1700 self._checkReadable()
1697 if not self.readable():
1698 raise IOError("File or stream is not readable.")
1699
1701 if n is None:
1700 if n is None:
1702 n = -1
1701 n = -1
1703 decoder = self._decoder or self._get_decoder()
1702 decoder = self._decoder or self._get_decoder()
1704 if n < 0:
1703 if n < 0:
1705 # Read everything.
1704 # Read everything.
1706 result = (self._get_decoded_chars() +
1705 result = (self._get_decoded_chars() +
1707 decoder.decode(self.buffer.read(), final=True))
1706 decoder.decode(self.buffer.read(), final=True))
1708 self._set_decoded_chars('')
1707 self._set_decoded_chars('')
1709 self._snapshot = None
1708 self._snapshot = None
1710 return result
1709 return result
(...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading...
1844 return self.buffer.getvalue().decode(self._encoding, self._errors)
1843 return self.buffer.getvalue().decode(self._encoding, self._errors)
1845
1844
1846 def __repr__(self):
1845 def __repr__(self):
1847 # TextIOWrapper tells the encoding in its repr. In StringIO,
1846 # TextIOWrapper tells the encoding in its repr. In StringIO,
1848 # that's a implementation detail.
1847 # that's a implementation detail.
1849 return object.__repr__(self)
1848 return object.__repr__(self)
1850
1849
1851 @property
1850 @property
1852 def encoding(self):
1851 def encoding(self):
1853 return None
1852 return None
OLD
NEW