python: Share generated methods between objects. justus/pyme3
authorJustus Winter <justus@gnupg.org>
Thu, 12 May 2016 16:29:04 +0000 (18:29 +0200)
committerJustus Winter <justus@gnupg.org>
Thu, 12 May 2016 16:29:04 +0000 (18:29 +0200)
* lang/python/pyme/util.py (GpgmeWrapper.__getattr__): Monkey-patch
the class.
* lang/python/tests/t-wrapper.py: Demonstrate the sharing.

Signed-off-by: Justus Winter <justus@gnupg.org>
lang/python/pyme/util.py
lang/python/tests/t-wrapper.py

index a856099..a9fa19d 100644 (file)
@@ -74,19 +74,25 @@ class GpgmeWrapper(object):
         if key[0] == '_' or self._getnameprepend() == None:
             return None
         name = self._getnameprepend() + key
         if key[0] == '_' or self._getnameprepend() == None:
             return None
         name = self._getnameprepend() + key
+        func = getattr(pygpgme, name)
+
         if self._errorcheck(name):
         if self._errorcheck(name):
-            def _funcwrap(*args, **kwargs):
-                args = [self.wrapped] + list(args)
-                return errorcheck(getattr(pygpgme, name)(*args, **kwargs),
+            def _funcwrap(slf, *args, **kwargs):
+                return errorcheck(func(slf.wrapped, *args, **kwargs),
                                   "Invocation of " + name)
         else:
                                   "Invocation of " + name)
         else:
-            def _funcwrap(*args, **kwargs):
-                args = [self.wrapped] + list(args)
-                return getattr(pygpgme, name)(*args, **kwargs)
+            def _funcwrap(slf, *args, **kwargs):
+                return func(slf.wrapped, *args, **kwargs)
+
+        _funcwrap.__doc__ = getattr(func, "__doc__")
+
+        # Monkey-patch the class.
+        setattr(self.__class__, key, _funcwrap)
 
 
-        _funcwrap.__doc__ = getattr(getattr(pygpgme, name), "__doc__")
+        # Bind the method to 'self'.
+        def wrapper(*args, **kwargs):
+            return _funcwrap(self, *args, **kwargs)
+        _funcwrap.__doc__ = getattr(func, "__doc__")
 
 
-        # Cache the wrapper function.
-        setattr(self, key, _funcwrap)
-        return _funcwrap
+        return wrapper
 
 
index acc2ecf..fab0d81 100755 (executable)
@@ -20,4 +20,6 @@
 from pyme import core
 
 d0 = core.Data()
 from pyme import core
 
 d0 = core.Data()
+d0.seek # trigger on-demand-wrapping
 assert d0.seek == d0.seek, "Generated wrapper functions are not cached"
 assert d0.seek == d0.seek, "Generated wrapper functions are not cached"
+assert hasattr(core.Data, 'seek'), "Generated wrapper functions are not shared"