Question

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?

Was it helpful?

Solution

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

OTHER TIPS

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

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top