Scripts to generate mypy compatible stubs for PySide2.
PySide2 itself comes with stubs. But the built-in type declaration doesn't work well with Python Language Server(pyls) and mypy, that is why the repo is here.
Currently the generated stubs is not 100% type error free, so you might need to ignore those errors. Adding --ignore-typing-err parameter does the trick.
Theoretically, with proper configuration (perhaps some tinkering or text replacement), it can also generate stubs for PyQt5 or some abstract layer on Qt binding in python, such as Qt.py. But that is not tested and cannot be guaranteed.
Notice this is not the official typing support of PySide2.
Beware, generate_stubs.py can not run under python2
usage: generate_stubs.py [-h] [--quiet] [--check] [-s STYLE] [-o OUTPATH]
[-m MODULE] [--ignore-typing-err]
[--sys-path SYS_PATH [SYS_PATH ...]]
modules [modules ...]
This script generates mypy compatible stubs for PySide2
positional arguments:
modules 'all' or the names of modules to build (QtCore QtGui
etc.)
optional arguments:
-h, --help show this help message and exit
--quiet Run quietly
--check Test the output if on Python 3
-s STYLE, --style STYLE
stubs import style: absolute, relative, all_relative
(default = absolute)
-o OUTPATH, --outpath OUTPATH
the output directory (default = parent of this script)
-m MODULE, --module MODULE
the output module name (default = PySide2)
--ignore-typing-err force mypy ignore stubs error by add "# type: ignore"
comments
--sys-path SYS_PATH [SYS_PATH ...]
a list of strings prepended to sys.path
P.S. The `style` here, refers to how stubs import dependencies within generated stubs. For example, ...
when using --style absolute, the generated stubs for QtWidgets.QWidget will be
import PySide2
class QWidget(PySide2.QtCore.QObject, PySide2.QtGui.QPaintDevice):
...when using --style relative, it will be
from . import QtCore
from . import QtGui
class QWidget(QtCore.QObject, QtGui.QPaintDevice):
...when using --style all_relative, it will be
from .QtCore import QObject
from .QtGui import QPaintDevice
class QWidget(QObject, QPaintDevice):
...Sadly, generated stubs doesn't works well with pyls and mypy at the same time. So in order to get the best result, you have to generate two different version, and config Python Extension and mypy to use the correct one.
To generate stubs for pyls, use:
python generate_stubs.py all -o the/stubs/directory/PySide2 -s absolutethen add the/stubs/directory/ into $PYTHONPATH within the .env file for python extension to config pyls. You can archive this by adding
"python.envFile": "path/to/.env",in .vscode/settings.json, and adding
PYTHONPATH=the/stubs/directory
in the .env file, path/to/.env.
To generate stubs for mypy, use:
python generate_stubs.py all -o the/stubs/directory/PySide2 -s relative --ignore-typing-errthen you can add
[mypy]
mypy_path = the/stubs/directoryin your mypy.ini, to config mypy correctly
-
due to the original typing info in PySide2,
PySide2.QtCore.Qt. ...sometimes can not use as parameter. For instanceQWidget.setAttribute(Qt.WA_NoSystemBackground)
doesn't pass the type check of mypy, even the code is absolutely valid. in order to fix this, you have to use
QWidget.setAttribute(Qt.WidgetAttribute.WA_NoSystemBackground)