|
4 | 4 | from __future__ import print_function |
5 | 5 | from __future__ import unicode_literals |
6 | 6 |
|
| 7 | +import array |
7 | 8 | import io |
8 | 9 | import typing |
9 | 10 | from io import SEEK_SET, SEEK_CUR |
10 | 11 |
|
11 | 12 | from .mode import Mode |
12 | 13 |
|
13 | 14 | if typing.TYPE_CHECKING: |
| 15 | + import mmap |
14 | 16 | from io import RawIOBase |
15 | 17 | from typing import ( |
16 | 18 | Any, |
@@ -88,8 +90,11 @@ def truncate(self, size=None): |
88 | 90 | return self._f.truncate(size) |
89 | 91 |
|
90 | 92 | def write(self, data): |
91 | | - # type: (bytes) -> int |
92 | | - count = self._f.write(data) |
| 93 | + # type: (Union[bytes, bytearray, memoryview, array.array[Any], mmap.mmap]) -> int |
| 94 | + if isinstance(data, array.array): |
| 95 | + count = self._f.write(data.tobytes()) |
| 96 | + else: |
| 97 | + count = self._f.write(data) # type: ignore |
93 | 98 | return len(data) if count is None else count |
94 | 99 |
|
95 | 100 | @typing.no_type_check |
@@ -130,17 +135,20 @@ def readinto1(self, b): |
130 | 135 | b[:bytes_read] = data |
131 | 136 | return bytes_read |
132 | 137 |
|
133 | | - def readline(self, limit=-1): |
134 | | - # type: (int) -> bytes |
135 | | - return self._f.readline(limit) |
| 138 | + def readline(self, limit=None): |
| 139 | + # type: (Optional[int]) -> bytes |
| 140 | + return self._f.readline(-1 if limit is None else limit) |
136 | 141 |
|
137 | | - def readlines(self, hint=-1): |
138 | | - # type: (int) -> List[bytes] |
139 | | - return self._f.readlines(hint) |
| 142 | + def readlines(self, hint=None): |
| 143 | + # type: (Optional[int]) -> List[bytes] |
| 144 | + return self._f.readlines(-1 if hint is None else hint) |
140 | 145 |
|
141 | | - def writelines(self, sequence): |
142 | | - # type: (Iterable[Union[bytes, bytearray]]) -> None |
143 | | - return self._f.writelines(sequence) |
| 146 | + def writelines(self, lines): |
| 147 | + # type: (Iterable[Union[bytes, bytearray, memoryview, array.array[Any], mmap.mmap]]) -> None |
| 148 | + _lines = ( |
| 149 | + line.tobytes() if isinstance(line, array.array) else line for line in lines |
| 150 | + ) |
| 151 | + return self._f.writelines(typing.cast("Iterable[bytes]", _lines)) |
144 | 152 |
|
145 | 153 | def __iter__(self): |
146 | 154 | # type: () -> Iterator[bytes] |
|
0 commit comments