[PyQt] Various issues with PyQt stubs

Phil Thompson phil at riverbankcomputing.com
Thu May 19 17:32:29 BST 2016


Some of these are simply bugs (which I will get around to) others (specifically the "incompatible with supertype") are more of a problem.

It isn't clear (to me anyway) what PEP 484 is trying to achieve. I had thought that it was to provide a way of describing an API in a formal way so that other tools could be written to exploit the additional information. Type checking tools such as mypy would be just one example. However mypy seems only to be interested in APIs that follow a certain pattern and considers APIs that don't follow that pattern to be erroneous - even though they are perfectly valid as far as Python is concerned.

It would be much better if mypy were to just ignore APIs (or give a warning) that it can't usefully analyse. Then at least it would be possible to use the mypy parser to validate stub files. I have tried explaining this to the relevent developers (as well as to the PyCharm developers who use stub files for auto-completion information) but with little success.

I have no personal need for stub files. It would be helpful if somebody who had a genuine need were to look at the PyQt stub files and see if they are useful, or if they need to be changed to be useful, or if they would be useful if the downstream tools were a bit more mature.

Phil

On 18 May 2016, at 9:47 pm, Florian Bruhin <me at the-compiler.org> wrote:
> 
> Hi,
> 
> I tried to start using mypy now that PyQt has stubs.
> 
> Since I can't easily install stubs currently I opted to add them to a
> repo (copied out after I ran configure.py in the PyQt repo). When I
> then run mypy with --check-untyped-defs and MYPYDIR set to the stubs
> dir, I get various issues mypy reports about the stub files.
> 
> The first one is obvious, a QtGui import is missing from various stub
> files:
> 
>    misc/stubs/PyQt5/QtPrintSupport.pyi: note: In function "metric":
>    misc/stubs/PyQt5/QtPrintSupport.pyi:177: error: Name 'QtGui' is not defined
>    misc/stubs/PyQt5/QtPrintSupport.pyi: note: At top level:
>    misc/stubs/PyQt5/QtPrintSupport.pyi:184a version with stubs : error: Name 'QtGui' is not defined
>    [...]
> 
> I fixed this for the stub modules I use, but more might be affected:
> https://github.com/The-Compiler/qutebrowser/commit/f372644124793467865b9a324a3ce77f9f0ff358
> 
> The same happens for QtNetwork in QtWebKitWidgets.pyi:
> 
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "load":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:105: error: Name 'QtNetwork' is not defined
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:229: error: Name 'QtNetwork' is not defined
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "acceptNavigationRequest":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:497: error: Invalid type "QtNetwork"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "downloadRequested":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:501: error: Invalid type "QtNetwork"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "unsupportedContent":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:502: error: Invalid type "QtNetwork"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "networkAccessManager":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:542: error: Invalid type "QtNetwork"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "setNetworkAccessManager":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:543: error: Invalid type "QtNetwork"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In function "load":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:619: error: Name 'QtNetwork' is not defined
> 
> With that fixed, there are still a lot of errors about incompatible
> types. I've looked into the first one:
> 
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QPixmap":
> 	misc/stubs/PyQt5/QtGui.pyi:181: error: Return type of "devicePixelRatio" incompatible with supertype "QPaintDevice"
> 
> Looking at the Qt documentation, it seems indeed like there's
> QPaintDevice::devicePixelRatio which returns an int, which is
> overridden by QPixmap::devicePixelRatio returning a qreal (aka float)?
> 
> Not sure how that'd best be expressed in the stubs, but it seems like
> MyPy doesn't like how it looks currently...
> 
> The others:
> 
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QBitmap":
> 	misc/stubs/PyQt5/QtGui.pyi:255: error: Argument 1 of "swap" incompatible with supertype "QPixmap"
> 	misc/stubs/PyQt5/QtGui.pyi:256: error: Signature of "transformed" incompatible with supertype "QPixmap"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QImage":
> 	misc/stubs/PyQt5/QtGui.pyi:2077: error: Return type of "devicePixelRatio" incompatible with supertype "QPaintDevice"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QMatrix4x4":
> 	misc/stubs/PyQt5/QtGui.pyi:2543: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QWindow":
> 	misc/stubs/PyQt5/QtGui.pyi:3933: error: Argument 1 of "setParent" incompatible with supertype "QObject"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QPaintDeviceWindow":
> 	misc/stubs/PyQt5/QtGui.pyi:3942: error: Definition of "devicePixelRatio" in base class "QWindow" is incompatible with definition in base class "QPaintDevice"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QPdfWriter":
> 	misc/stubs/PyQt5/QtGui.pyi:5309: error: Signature of "setPageSize" incompatible with supertype "QPagedPaintDevice"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QTextList":
> 	misc/stubs/PyQt5/QtGui.pyi:7378: error: Argument 1 of "setFormat" incompatible with supertype "QTextObject"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QTextTable":
> 	misc/stubs/PyQt5/QtGui.pyi:7591: error: Argument 1 of "setFormat" incompatible with supertype "QTextObject"
> 	misc/stubs/PyQt5/QtGui.pyi: note: In class "QTransform":
> 	misc/stubs/PyQt5/QtGui.pyi:7712: error: Overloaded function signatures 3 and 4 overlap with incompatible return types
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QWidget":
> 	misc/stubs/PyQt5/QtWidgets.pyi:195: error: Signature of "setParent" incompatible with supertype "QObject"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QAbstractItemView":
> 	misc/stubs/PyQt5/QtWidgets.pyi:721: error: Signature of "update" incompatible with supertype "QWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QApplication":
> 	misc/stubs/PyQt5/QtWidgets.pyi:1102: error: Signature of "topLevelAt" incompatible with supertype "QGuiApplication"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QFileSystemModel":
> 	misc/stubs/PyQt5/QtWidgets.pyi:3139: error: Signature of "parent" incompatible with supertype "QAbstractItemModel"
> 	misc/stubs/PyQt5/QtWidgets.pyi:3139: error: Signature of "parent" incompatible with supertype "QObject"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QGraphicsPixmapItem":
> 	misc/stubs/PyQt5/QtWidgets.pyi:4288: error: Signature of "paint" incompatible with supertype "QGraphicsItem"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QGraphicsSimpleTextItem":
> 	misc/stubs/PyQt5/QtWidgets.pyi:4313: error: Signature of "paint" incompatible with supertype "QGraphicsItem"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QGraphicsTextItem":
> 	misc/stubs/PyQt5/QtWidgets.pyi:4399: error: Signature of "paint" incompatible with supertype "QGraphicsItem"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QGraphicsProxyWidget":
> 	misc/stubs/PyQt5/QtWidgets.pyi:4570: error: Signature of "paint" incompatible with supertype "QGraphicsWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi:4570: error: Signature of "paint" incompatible with supertype "QGraphicsItem"
> 	misc/stubs/PyQt5/QtWidgets.pyi:4571: error: Signature of "setGeometry" incompatible with supertype "QGraphicsWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QGraphicsView":
> 	misc/stubs/PyQt5/QtWidgets.pyi:5027: error: Signature of "render" incompatible with supertype "QWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QHeaderView":
> 	misc/stubs/PyQt5/QtWidgets.pyi:5191: error: Argument 1 of "initStyleOption" incompatible with supertype "QFrame"
> 	misc/stubs/PyQt5/QtWidgets.pyi:5216: error: Signature of "scrollTo" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QListWidget":
> 	misc/stubs/PyQt5/QtWidgets.pyi:5901: error: Argument 1 of "closePersistentEditor" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtWidgets.pyi:5902: error: Argument 1 of "openPersistentEditor" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QPlainTextEdit":
> 	misc/stubs/PyQt5/QtWidgets.pyi:6592: error: Signature of "find" incompatible with supertype "QWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QProxyStyle":
> 	misc/stubs/PyQt5/QtWidgets.pyi:6732: error: Signature of "polish" incompatible with supertype "QCommonStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6732: error: Signature of "polish" incompatible with supertype "QStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6740: error: Signature of "standardPixmap" incompatible with supertype "QCommonStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6740: error: Signature of "standardPixmap" incompatible with supertype "QStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6748: error: Signature of "subControlRect" incompatible with supertype "QCommonStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6748: error: Signature of "subControlRect" incompatible with supertype "QStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6749: error: Signature of "subElementRect" incompatible with supertype "QCommonStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6749: error: Signature of "subElementRect" incompatible with supertype "QStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6750: error: Signature of "sizeFromContents" incompatible with supertype "QCommonStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi:6750: error: Signature of "sizeFromContents" incompatible with supertype "QStyle"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QRubberBand":
> 	misc/stubs/PyQt5/QtWidgets.pyi:6791: error: Signature of "resize" incompatible with supertype "QWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QSplashScreen":
> 	misc/stubs/PyQt5/QtWidgets.pyi:7180: error: Signature of "repaint" incompatible with supertype "QWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QStackedLayout":
> 	misc/stubs/PyQt5/QtWidgets.pyi:7284: error: Return type of "addWidget" incompatible with supertype "QLayout"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QStylePainter":
> 	misc/stubs/PyQt5/QtWidgets.pyi:8174: error: Signature of "begin" incompatible with supertype "QPainter"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QTableWidget":
> 	misc/stubs/PyQt5/QtWidgets.pyi:8528: error: Argument 1 of "closePersistentEditor" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtWidgets.pyi:8529: error: Argument 1 of "openPersistentEditor" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QTextEdit":
> 	misc/stubs/PyQt5/QtWidgets.pyi:8783: error: Signature of "find" incompatible with supertype "QWidget"
> 	misc/stubs/PyQt5/QtWidgets.pyi: note: In class "QTreeWidget":
> 	misc/stubs/PyQt5/QtWidgets.pyi:9256: error: Signature of "closePersistentEditor" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtWidgets.pyi:9257: error: Signature of "openPersistentEditor" incompatible with supertype "QAbstractItemView"
> 	misc/stubs/PyQt5/QtCore.pyi: note: In class "QAbstractTableModel":
> 	misc/stubs/PyQt5/QtCore.pyi:1899: error: Signature of "parent" incompatible with supertype "QAbstractItemModel"
> 	misc/stubs/PyQt5/QtCore.pyi: note: In class "QAbstractListModel":
> 	misc/stubs/PyQt5/QtCore.pyi:1910: error: Signature of "parent" incompatible with supertype "QAbstractItemModel"
> 	misc/stubs/PyQt5/QtCore.pyi: note: In class "QIdentityProxyModel":
> 	misc/stubs/PyQt5/QtCore.pyi:3746: error: Signature of "parent" incompatible with supertype "QAbstractItemModel"
> 	misc/stubs/PyQt5/QtCore.pyi:3746: error: Signature of "parent" incompatible with supertype "QObject"
> 	misc/stubs/PyQt5/QtCore.pyi: note: In class "QStringListModel":
> 	misc/stubs/PyQt5/QtCore.pyi:6911: error: Signature of "data" incompatible with supertype "QAbstractItemModel"
> 	misc/stubs/PyQt5/QtCore.pyi: note: In class "QTemporaryFile":
> 	misc/stubs/PyQt5/QtCore.pyi:6975: error: Signature of "open" incompatible with supertype "QFile"
> 	misc/stubs/PyQt5/QtCore.pyi:6975: error: Signature of "open" incompatible with supertype "QIODevice"
> 	misc/stubs/PyQt5/QtPrintSupport.pyi: note: In class "QPrinter":
> 	misc/stubs/PyQt5/QtPrintSupport.pyi:264: error: Signature of "setPageMargins" incompatible with supertype "QPagedPaintDevice"
> 	misc/stubs/PyQt5/QtNetwork.pyi: note: In class "QHostAddress":
> 	misc/stubs/PyQt5/QtNetwork.pyi:415: error: Overloaded function signatures 2 and 3 overlap with incompatible return types
> 	misc/stubs/PyQt5/QtNetwork.pyi: note: In class "QSslSocket":
> 	misc/stubs/PyQt5/QtNetwork.pyi:1605: error: Signature of "connectToHost" incompatible with supertype "QAbstractSocket"
> 	misc/stubs/PyQt5/QtNetwork.pyi:1654: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
> 	misc/stubs/PyQt5/QtNetwork.pyi:1662: error: Overloaded function signatures 1 and 2 overlap with incompatible return types
> 	misc/stubs/PyQt5/QtWebKit.pyi: note: In function "webFrame":
> 	misc/stubs/PyQt5/QtWebKit.pyi:111: error: Name 'QWebFrame' is not defined
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi: note: In class "QGraphicsWebView":
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:89: error: Signature of "sizeHint" incompatible with supertype "QGraphicsWidget"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:89: error: Signature of "sizeHint" incompatible with supertype "QGraphicsLayoutItem"
> 	misc/stubs/PyQt5/QtWebKitWidgets.pyi:94: error: Signature of "setGeometry" incompatible with supertype "QGraphicsWidget"
> 
> Florian
> 
> -- 
> http://www.the-compiler.org | me at the-compiler.org (Mail/XMPP)
>   GPG: 916E B0C8 FD55 A072 | http://the-compiler.org/pubkey.asc
>         I love long mails! | http://email.is-not-s.ms/
> _______________________________________________
> PyQt mailing list    PyQt at riverbankcomputing.com
> https://www.riverbankcomputing.com/mailman/listinfo/pyqt



More information about the PyQt mailing list