[PyQt] BUG: sip instance attribute error: Re: [eric4] python qscintilla traceback with current snapshot also

Hans-Peter Jansen hpj at urpla.net
Wed Feb 2 21:25:09 GMT 2011


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?)

Pete


More information about the PyQt mailing list