[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