Python 2 にも同じio
ライブラリが含まれています。
from io import open
Python のバージョン間で同じように動作するために使用します。
次に、APIは、クラス ライブラリを使用して同じ機能を提供するopen()
同等のもの (open()
またはと呼ばれるmake_stream()
)を提供する必要があります。io
io.RawIOBase
ABCを実装するクラスを作成し、ライブラリが提供する他のクラスを使用して、必要に応じてバッファリングとテキスト処理を追加するだけです。
import io
class MyFileObjectWrapper(io.RawIOBase):
def __init__(self, *args):
# do what needs done
def close(self):
if not self.closed:
# close the underlying file
self.closed = True
# ... etc for what is needed (e.g. def read(self, maxbytes=None), etc.
def open(fileobj, mode='r', buffering=-1, encoding=None, errors=None, newline=None):
# Mode parsing and validation adapted from the io/_iomodule.c module
reading, writing, appending, updating = False
text, binary, universal = False
for c in mode:
if c == 'r':
reading = True;
continue
if c == 'w':
writing = True;
continue
if c == 'a':
appending = True;
continue
if c == '+':
updating = True;
continue
if c == 't':
text = True;
continue
if c == 'b':
binary = True;
continue
if c == 'U':
universal = reading = True;
continue
raise ValueError('invalid mode: {!r}'.format(mode))
rawmode = []
if reading: rawmode.append('r')
if writing: rawmode.append('w')
if appending: rawmode.append('a')
if updating: rawmode.append('+')
rawmode = ''.join(rawmode)
if universal and (writing or appending):
raise ValueError("can't use U and writing mode at once")
if text and binary) {
raise ValueError("can't have text and binary mode at once")
if reading + writing + appending > 1:
raise ValueError("must have exactly one of read/write/append mode")
if binary
if encoding is not None:
raise ValueError("binary mode doesn't take an encoding argument")
if errors is not None:
raise ValueError("binary mode doesn't take an errors argument")
if newline is not None:
raise ValueError("binary mode doesn't take a newline argument")
raw = MyFileObjectWrapper(fileobj)
if buffering == 1:
buffering = -1
line_buffering = True
else:
line_buffering = False
if buffering < 0:
buffering = SOME_SUITABLE_DEFAULT
if not buffering
if not binary:
raise ValueError("can't have unbuffered text I/O")
return raw
if updating:
buffered_class = io.BufferedRandom
elif writing or appending:
buffered_class = io.BufferedWriter
elif reading:
buffered_class = io.BufferedReader
buffer = buffered_class(raw, buffering)
if binary:
return buffer
return io.TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
上記のコードは、主にModules/_io/_iomodule.c
io_open
関数から改作されていますが、未加工のファイル オブジェクトがABCのMyFileObjectWrapper
サブクラスに置き換えられています。io.RawIOBase