summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustus Winter <justus@gnupg.org>2016-05-12 18:29:04 +0200
committerJustus Winter <justus@gnupg.org>2016-05-12 18:29:04 +0200
commit11314f0db6e57597e3f56351a86fdb36a7a17dd7 (patch)
treecc5796aba6cbe95d7f2f80a09f07f7b8b1b3271e
parentc5d118b2a76e9528df780d11da9566ff7c22e4f5 (diff)
downloadgpgme-justus/pyme3.tar.gz
python: Share generated methods between objects.justus/pyme3
* 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>
-rw-r--r--lang/python/pyme/util.py26
-rwxr-xr-xlang/python/tests/t-wrapper.py2
2 files changed, 18 insertions, 10 deletions
diff --git a/lang/python/pyme/util.py b/lang/python/pyme/util.py
index a8560992..a9fa19d2 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 acc2ecfd..fab0d811 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"