12

I have the following code:

import sys
import platform
from PyQt4.QtGui import QApplication
from PyQt4.QtWebKit import QWebPage

class Render(QWebPage):
    def __init__(self):
        self.app = QApplication([])
        QWebPage.__init__(self)

    @property
    def html(self):
        return self.mainFrame().toHtml.toAscii()

page = Render()
print sys.version, platform.platform()
print 'html attribute?', [p for p in dir(page) if 'html' in p]
print page.html

gives this exception output:

stav@maia:$ python property.py
2.7.3 (default, Aug  1 2012, 05:14:39)
[GCC 4.6.3] Linux-3.2.0-38-generic-x86_64-with-Ubuntu-12.04-precise
html attribute? ['html']
Traceback (most recent call last):
  File "property.py", line 18, in <module>
    print page.html
AttributeError: 'Render' object has no attribute 'html'

If I remove the @property decorator or I remove the .toAscii call, then it works. But why does the error say there is no attribute even tho dir(page) shows it?

Steven Almeroth
  • 7,758
  • 2
  • 50
  • 57

2 Answers2

16

The issue here is that Python gave a misleading error message. The error message one would expect in this case is this:

AttributeError: 'function' object has no attribute 'toAscii'

But instead, Python gave a misleading error message:

AttributeError: 'Render' object has no attribute 'html'

That is, an AttributeError generated within the property function was presented as if it were an AttributeError for the property itself.

This strange behavior occurs when the class with your @property is derived from QObject. It is a known issue in PyQt. In fact, the PyQt maintainers claim it is expected behavior (wrongly, IMHO). See this thread for details. (In that thread, it is claimed that QObject behaves identically to Python's built-in object class, but my own testing indicates otherwise.)

Stuart Berg
  • 17,026
  • 12
  • 67
  • 99
  • Super! I was hoping to get this answer originally, but Rob helped me get by the other issues I was having with calling (). – Steven Almeroth Oct 31 '13 at 22:07
  • 1
    Unfortunately, I can only upvote this once. I spent several hours trying to figure out why 2 properties using the same QObject suddenly stopped working at the same time. – AI0867 Feb 04 '22 at 10:09
1

You probably meant .toHtml().toAscii(). Note the missing parentheses.

Robᵩ
  • 163,533
  • 20
  • 239
  • 308