[Pkg-gnupg-commit] [gpgme] 95/412: python: Share generated methods between objects.

Daniel Kahn Gillmor dkg at fifthhorseman.net
Thu Sep 22 21:26:23 UTC 2016


This is an automated email from the git hooks/post-receive script.

dkg pushed a commit to branch master
in repository gpgme.

commit 11314f0db6e57597e3f56351a86fdb36a7a17dd7
Author: Justus Winter <justus at gnupg.org>
Date:   Thu May 12 18:29:04 2016 +0200

    python: Share generated methods between objects.
    
    * 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 at gnupg.org>
---
 lang/python/pyme/util.py       | 26 ++++++++++++++++----------
 lang/python/tests/t-wrapper.py |  2 ++
 2 files changed, 18 insertions(+), 10 deletions(-)

diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py
index a856099..a9fa19d 100644
--- a/lang/python/pyme/util.py
+++ b/lang/python/pyme/util.py
@@ -74,19 +74,25 @@ class GpgmeWrapper(object):
         if key[0] == '_' or self._getnameprepend() == None:
             return None
         name = self._getnameprepend() + key
+        func = getattr(pygpgme, 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:
-            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
 
diff --git a/lang/python/tests/t-wrapper.py b/lang/python/tests/t-wrapper.py
index acc2ecf..fab0d81 100755
--- a/lang/python/tests/t-wrapper.py
+++ b/lang/python/tests/t-wrapper.py
@@ -20,4 +20,6 @@
 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 hasattr(core.Data, 'seek'), "Generated wrapper functions are not shared"

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-gnupg/gpgme.git



More information about the Pkg-gnupg-commit mailing list