[PyQt] BUG: sip instance attribute error: Re: [eric4] python qscintilla traceback with current snapshot also
Phil Thompson
phil at riverbankcomputing.com
Wed Feb 2 21:29:48 GMT 2011
On Wed, 2 Feb 2011 22:25:09 +0100, "Hans-Peter Jansen" <hpj at urpla.net>
wrote:
> On Wednesday 02 February 2011, 22:16:46 Phil Thompson wrote:
>> On Wed, 2 Feb 2011 21:33:39 +0100, "Hans-Peter Jansen"
>> <hpj at urpla.net>
>>
>> wrote:
>> > [Oops, sorry, send too fast]
>> >
>> > Dear Phil,
>> >
>> > On Tuesday 01 February 2011, 22:26:43 Hans-Peter Jansen wrote:
>> >> Phil, something is badly broken with the current release and the
>> >> snapshots.
>> >
>> > Here's the essence of the issue:
>> >
>> > class A(object):
>> > def __init__(self):
>> > # catch access a non existing attribute
>> > try:
>> > print self.a, type(self.a)
>> > except AttributeError:
>> > pass
>> >
>> > a = A()
>> >
>> > from PyQt4.Qsci import QsciScintilla
>> >
>> > # derive from a sip wrapped class
>> > class B(QsciScintilla):
>> > def __init__(self):
>> > # access a non existing attribute results in:
>> > # TypeError: 'sip.methoddescriptor' object is not callable
>> > try:
>> > print self.b, type(self.b)
>> > except AttributeError:
>> > pass
>> >
>> > b = B()
>> >
>> > results in:
>> >
>> > Traceback (most recent call last):
>> > File "sipinstance.py", line 22, in <module>
>> > b = B()
>> > File "sipinstance.py", line 18, in __init__
>> > print self.b, type(self.b)
>> > TypeError: 'sip.methoddescriptor' object is not callable
>> >
>> > Obviously, accessing non existing attributes in classes wrapped by
>> > sip causes havoc (an unexpected TypeError).
>> >
>> > At least for:
>> > python: 2.6
>> > sip: 4.12.1
>> > qt4: 4.6.3
>> > pyqt4: snapshot-4.8.4-278054fd857c
>> >
>> >
>> > I was able to fix eric with this diff:
>> >
>> > --- QScintilla/Editor.py~ 2011-02-02 21:31:20.741149390 +0100
>> > +++ QScintilla/Editor.py 2011-02-02 21:31:30.683988621 +0100
>> > @@ -1258,7 +1258,7 @@ class Editor(QsciScintillaCompat):
>> > """
>> > try:
>>
>> self.supportedEols[self.getLineSeparator()].setChecked(True)
>>
>> > - except AttributeError:
>> > + except (AttributeError, TypeError):
>> > pass
>> >
>> > def __eolChanged(self):
>> >
>> > Note: self.supportedEols doesn't exist, when this method is called
>> > the first
>> > time.
>> >
>> > Guess, it's sip 4.12.2 time ;-)
>> >
>> > Pete
>>
>> If I run the code as above I get a "RuntimeError: underlying
>> C/C++..." as expected. Adding the missing call to
>> QsciScintilla.__init__() (and creating a QApplication at the start)
>> then it runs fine (ie. an AttributeError is raised).
>
> You mean:
>
> class A(object):
> def __init__(self):
> # catch access a non existing attribute
> try:
> print self.a, type(self.a)
> except AttributeError:
> pass
>
> a = A()
>
> from PyQt4 import QtGui
> from PyQt4.Qsci import QsciScintilla
>
> app = QtGui.QApplication([])
>
> # derive from a sip wrapped class
> class B(QsciScintilla):
> def __init__(self):
> super(B, self).__init__()
> # access a non existing attribute results in:
> # TypeError: 'sip.methoddescriptor' object is not callable
> try:
> print self.b, type(self.b)
> except AttributeError:
> pass
>
> b = B()
>
>
> but still:
>
> Traceback (most recent call last):
> File "sipinstance.py", line 28, in <module>
> b = B()
> File "sipinstance.py", line 24, in __init__
> print self.b, type(self.b)
> TypeError: 'sip.methoddescriptor' object is not callable
>
> It might be a Python version issue? (where I'm on 2.6, and you?)
I've tried it with 2.6, 2.7 and 3.2rc2 - works fine.
Phil
More information about the PyQt
mailing list