Make DeferredOperand handle sets, dirs, dels transparently by passing
authorScott Gasch <[email protected]>
Tue, 18 Oct 2022 06:03:38 +0000 (23:03 -0700)
committerScott Gasch <[email protected]>
Tue, 18 Oct 2022 06:03:38 +0000 (23:03 -0700)
them along to the wrapped result.

src/pyutils/parallelize/deferred_operand.py

index 8d5c30c5ac8cd7adb651bb37935d60e3afdfb398..5bb823f746dfbde100cbad148ef4da5ed9f579b8 100644 (file)
@@ -181,5 +181,20 @@ class DeferredOperand(ABC, Generic[T]):
     def __float__(self) -> float:
         return float(DeferredOperand.resolve(self))
 
-    def __getattr__(self, method_name):
-        return getattr(DeferredOperand.resolve(self), method_name)
+    def __getattr__(self, name):
+        return getattr(DeferredOperand.resolve(self), name)
+
+    def __setattr__(self, name, value):
+        # subclass setting its own properties
+        if name in set(['id', 'wrapped_future']):
+            object.__setattr__(self, name, value)
+            return
+
+        # otherwise operate on the wrapped result
+        DeferredOperand.resolve(self).__setattr__(name, value)
+
+    def __delattr__(self, name):
+        return delattr(DeferredOperand.resolve(self), name)
+
+    def __dir__(self):
+        return dir(DeferredOperand.resolve(self))