Jul-07-2022, 12:49 PM
There are many ways to do this.
class ReadWriteMixed: def __init__(self, fileobj): self.fileobj = fileobj def __getattr__(self, name): """ For lazyness """ return getattr(self.fileobj, name) def write(self, data: str | bytes): if isinstance(data, str) and "b" in self.fileobj.mode: data = data.encode() elif isinstance(data, bytes) and "b" not in self.fileobj.mode: data = data.decode() self.fileobj.write(data) def read_bytes(self, size=None): data = self.fileobj.read(size) if "b" not in self.fileobj.mode: data = data.encode() return data def read_text(self, size=None): data = self.fileobj.read(size) if "b" in self.fileobj.mode: data = data.decode() return data def open_mixed(file, mode="r"): return ReadWriteMixed(open(file, mode)) file_like = open_mixed("/etc/issue", "rb") # open in bytes mode print(file_like.read_text()) # read_text makes an implicit conversion, if mode is bytesBut I would never use this code. The problem is, that you have lesser control if something happens automagically.
Almost dead, but too lazy to die: https://sourceserver.info
All humans together. We don't need politicians!
All humans together. We don't need politicians!