[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