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@gnupg.org>
This commit is contained in:
Justus Winter 2016-05-12 18:29:04 +02:00
parent c5d118b2a7
commit 11314f0db6
2 changed files with 18 additions and 10 deletions

View File

@ -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(getattr(pygpgme, name), "__doc__")
_funcwrap.__doc__ = getattr(func, "__doc__")
# Cache the wrapper function.
setattr(self, key, _funcwrap)
return _funcwrap
# Monkey-patch the class.
setattr(self.__class__, key, _funcwrap)
# Bind the method to 'self'.
def wrapper(*args, **kwargs):
return _funcwrap(self, *args, **kwargs)
_funcwrap.__doc__ = getattr(func, "__doc__")
return wrapper

View File

@ -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"