From 44730b44659465bdf3d705ac680f915bb8f4070d Mon Sep 17 00:00:00 2001 From: Wauplin Date: Tue, 20 Jul 2021 15:01:09 +0200 Subject: [PATCH 1/2] Wrap all StdHook methods --- deepkit/__init__.py | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/deepkit/__init__.py b/deepkit/__init__.py index 6615344..c5727a6 100644 --- a/deepkit/__init__.py +++ b/deepkit/__init__.py @@ -59,19 +59,19 @@ class StdHook: def __init__(self, s): self.s = s - def fileno(self): - return self.s.fileno() - - def isatty(self): - return self.s.isatty() - - def flush(self): - self.s.flush() - def write(self, s): self.s.write(s) log(s) + def __getattr__(self, name): + if name == "s": + super(StdHook, self).__getattr__(name) + return getattr(self.s, name) + + def __setattr__(self, name, value): + if name == "s": + super(StdHook, self).__setattr__(name, value) + return setattr(self.s, name, value) sys.stdout = StdHook(sys.__stdout__) sys.stderr = StdHook(sys.__stderr__) From 4d9aac396bb29b43adbfb7c517e36a26d8af2d61 Mon Sep 17 00:00:00 2001 From: Wauplin Date: Wed, 21 Jul 2021 07:50:01 +0200 Subject: [PATCH 2/2] Add comments --- deepkit/__init__.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/deepkit/__init__.py b/deepkit/__init__.py index c5727a6..023fd72 100644 --- a/deepkit/__init__.py +++ b/deepkit/__init__.py @@ -64,13 +64,26 @@ def write(self, s): log(s) def __getattr__(self, name): - if name == "s": - super(StdHook, self).__getattr__(name) + """Forward the __getattr__ call to the wrapped object. + + From https://docs.python.org/3/reference/datamodel.html#object.__getattr__: + > Note that if the attribute is found through the normal mechanism, + > __getattr__() is not called. + + Therefore, `self.s` does not run into a recursion error. + """ return getattr(self.s, name) def __setattr__(self, name, value): + """Set an attribute on the wrapped object. + + Taken from: https://stackoverflow.com/a/17020163/15235649 + + Note: `super(StdHook, self).__setattr__` returns the method from + `object.__setattr__. + """ if name == "s": - super(StdHook, self).__setattr__(name, value) + return super(StdHook, self).__setattr__(name, value) return setattr(self.s, name, value) sys.stdout = StdHook(sys.__stdout__)