PyQt6 stubs

Phil Thompson phil at riverbankcomputing.com
Wed Aug 3 22:11:35 BST 2022


On 03/08/2022 20:44, Philippe Fremy wrote:
> Hi Phil,
> 
> 
>>> As you found out, we have a work-in-progress project for PyQt6-stubs.
>>> Like many open source projects, it progresses with volonteers
>>> availability and recently, progress has been low on this one. I 
>>> intend
>>> to change that during August.
>> 
>> As I have said before I would prefer to receive bug reports so that 
>> the root causes can be fixed to the benefit of all SIP projects. As I 
>> don't use mypy myself then those bug reports would need to patiently 
>> explain what changes are needed and why.
>> 
>> Phil
> 
> Unfortunately, the list is quite long. I am not sure how to file a
> proper bug report, and even if the fix could be handled at the sip
> level. Many stub fixes are linked to Qt's design or mypy syntax.
> 
> Getting stubs to correctly describe Python code capabilities can be 
> tricky.
> 
> To give you a short overview, the things we fixed in the stubs can be
> splitted in the following categories :
> 
> 
> 1. all signals are described as function, which is incorrect. A signal
> is an object which is bound during instanciation. So we fix all
> signals definition from a function declaration to something more
> elaborate (an unbound object + a bound object)
> 
> 
> 2. all methods which may accept None as parameter. Typically, all
> widget constructors have an optional parent widget, which can be None.
> Currently, the stubs will describe this as :
> 
>          def __init__(parent: QWidget): ...
> 
> But the correct definition is :
> 
>        def __init__(parent: typing.Optional[QWidget]): ...
> 
> This applies basically to every Qt method accepting a pointer to
> something, which may also be NULL. Quite a few of them. This we fix
> manually as they get reported by users.
> 
> 
> 3. Missing operators for class that support them. For example, QSize
> and QSizeF support some additions and scalar multiplications.
> QTreeWidgetItem support comparison.
> 
> 
> 4. Silencing mypy errors due to Qt's inherent design. Like a subclass
> providing a method whose signature is incompatible with the parent
> class method signature.
> 
> 
> 5. Some missing staticmethod decorators
> 
> 
> 6. Some missing imports for the stubs to be correct
> 
> 
> 7. Some method/function/decorators have such a complex usage that an
> advanced knowledge of mypy stub syntax is needed to annotate them
> correctly. That's the case for example for pyqtSlot and pyqtProperty
> 
> 
> There are probably a few more but that gives you an idea of what we
> are talking about. Nowadays, we used some patching automation to fix
> the problems we are aware of for the stubs.
> 
> 
> Out of the problem I described, item 1, 5 and 6 can certainly be fixed
> at the sip level. For all the others, there is not much to do except
> to apply blindly a better stub definition than what is currently
> available.
> 
> 
> You can get a glimps of some of our fixes by looking at this file :
> https://github.com/python-qt-tools/PyQt6-stubs/blob/main/fixes/annotation_fixes.py#L74
> 
> For every FixParameter, the 3rd argument is the old annotation from
> PyQt6 and the 2nd is the annotation we want to put instead.
> 
> 
> I am curious what you think of all this and if you want this to be
> contributed back to PyQt6 ?

I suggest you review your list against the current version of PyQt6. 2, 
3 and 6 should be fixed.

Phil


More information about the PyQt mailing list