Doctor Munchkin
2010-Dec-01 13:18 UTC
[Xapian-discuss] Using a subclass of MatchSpy in Python bindings
Hi everyone, I've searched the mail archives and I haven't been able to find a solution to this. I want to subclass a MatchSpy in the Python bindings and have Enquire use it. However, when I try to do so, I get a TypeError raised. The following example illustrates this:>>> import xapian >>> database = xapian.Database(dbpath) >>> class MyMatchSpy(xapian.MatchSpy):... def __init__(self): ... pass ... def __call__(self, *args, **kw): ... print "called with", args, kw ...>>> ms = MyMatchSpy() >>> enquire = xapian.Enquire(database) >>> enquire.add_matchspy(ms)Traceback (most recent call last): File "<stdin>", line 1, in <module> File "/usr/lib/python2.6/dist-packages/xapian/__init__.py", line 6920, in _enquire_match_spy_add _enquire_add_matchspy_orig(self, decider) TypeError: in method 'Enquire_add_matchspy', argument 2 of type 'Xapian::MatchSpy *' Am I missing something obvious here, or is swig misbehaving? The above works if ms is an instance of xapian.ValueCountMatchSpy, but I need to implement something different to this. I'm running the latest Xapian from Debian sid:>>> xapian.version_string()'1.2.3' Thanks, Munchkin
Olly Betts
2010-Dec-01 21:52 UTC
[Xapian-discuss] Using a subclass of MatchSpy in Python bindings
On Wed, Dec 01, 2010 at 01:18:40PM +0000, Doctor Munchkin wrote:> >>> class MyMatchSpy(xapian.MatchSpy): > ... def __init__(self): > ... pass > ... def __call__(self, *args, **kw): > ... print "called with", args, kw > ... > >>> ms = MyMatchSpy() > >>> enquire = xapian.Enquire(database) > >>> enquire.add_matchspy(ms) > Traceback (most recent call last): > File "<stdin>", line 1, in <module> > File "/usr/lib/python2.6/dist-packages/xapian/__init__.py", line > 6920, in _enquire_match_spy_add > _enquire_add_matchspy_orig(self, decider) > TypeError: in method 'Enquire_add_matchspy', argument 2 of type > 'Xapian::MatchSpy *' > > Am I missing something obvious here, or is swig misbehaving? The above > works if ms is an instance of xapian.ValueCountMatchSpy, but I need to > implement something different to this.I think you need to call the base class constructor in your constructor: def __init__(self): xapian.MatchSpy.__init__(self) Cheers, Olly