[PyQt] BUG: sip instance attribute error: Re: [eric4] python qscintilla traceback with current snapshot also
Phil Thompson
phil at riverbankcomputing.com
Sun Feb 6 15:40:41 GMT 2011
On Sun, 6 Feb 2011 15:49:59 +0100, "Hans-Peter Jansen" <hpj at urpla.net>
wrote:
> On Thursday 03 February 2011, 11:02:32 Phil Thompson wrote:
>> On Thu, 3 Feb 2011 00:42:05 +0100, "Hans-Peter Jansen"
>> <hpj at urpla.net>
>>
>> > Other than that, I'm pretty baffled at the moment. How could I
>> > debug this issue any further? If I'm going to try bisecting it,
>> > would you think, that rebuilding sip is sufficient (supposed, that
>> > 4.12 will not be affected, and hence the issue won't cross library
>> > version changes)?
>> >
>> > Begging-for-ideas-ly-yours,
>> > Pete
>>
>> As your test case is so simple, and that the only bug reports I've
>> had for either SIP or PyQt are a couple related to pyuic, it suggests
>> that the problem is the way you are building them.
>
> The build system is fully documented (OBS, you remember), and didn't
> changed since month. I don't play any really dirty games there. Two
> patches are applied (inherited from openSUSE builds, where they're used
> since ages):
> * disable RPATH
> * disable timestamping sip generated files
>
> The former is not needed and the latter is used by the build system to
> detect real changes to built packages: if they don't differ, they're
> quashed (in order to avoid too much churn, aka build storms). You might
> remember, that I asked you for a global persistent flag in sip to
> disable it generally: that would spare us the second patch.
>
> Since the OBS creates a defined build environment that only contains the
> defined build dependencies every time a package is build, this reduces
> the risk of misdirected side effects during build significantly.
>
> Using a package manager for the resulting packages eliminates the usual
> caveats of having stray builds lying around, dependency issues, and the
> like. All in all, it's a pretty robust "production grade" setup, that
> is also used to produce full distributions.
>
>
> Back to the issue. Still no bisection, but a few more data points:
> * it doesn't appear for basic Qt types like QDate
> * it's not related to QScintilla
>
>
> from PyQt4 import QtCore, QtGui
>
> class A(object):
> def __init__(self):
> # catch access a non existing attribute
> try:
> print self.a, type(self.a)
> except AttributeError:
> pass
>
> a = A()
>
> # derive from a sip wrapped class
> class B(QtCore.QDate):
> def __init__(self):
> super(B, self).__init__()
> try:
> print self.b, type(self.b)
> except AttributeError:
> pass
>
> b = B()
>
> #app = QtGui.QApplication([])
>
> # derive from a sip wrapped class
> class C(QtCore.QObject):
> def __init__(self):
> super(C, self).__init__()
> # access a non existing attribute results in:
> # TypeError: 'sip.methoddescriptor' object is not callable
> try:
> print self.c, type(self.c)
> except AttributeError:
> pass
>
> c = C()
>
>
> results in
>
> Traceback (most recent call last):
> File "sipinstance-v2.py", line 38, in <module>
> c = C()
> File "sipinstance-v2.py", line 34, in __init__
> print self.c, type(self.c)
> TypeError: 'sip.methoddescriptor' object is not callable
>
> Instancing QApplication or not doesn't seem to matter here, though.
>
> Given, that at least another report for win32 exists, this issue is may
> be more involved, than it appears on the surface.
>
> Pete
It will be related to the new support for __getattr__ in QObject.
You could look at qpycore_qobject_getattr.cpp and see what it is returning
in the failing case - it should raise the AttributeError and return 0.
Phil
More information about the PyQt
mailing list