Wrong type annotation of pyqtSlot in PyQt5

Alexander Hedges alexander.hedges at fotokite.com
Fri Sep 22 07:32:02 BST 2023


On Thu, Sep 21, 2023 at 1:42 PM Kyle Altendorf <sda at fstab.net> wrote:
>
> On Thu, Sep 21, 2023, at 06:01, Alexander Hedges wrote:
> > Hi,
> >
> > Currently in PyQt5 (as of the latest development build) the pyqtSlot decorator
> > is typed as:
> >
> > ```python
> > def pyqtSlot(*args: typing.Any, name: typing.Optional[str] = ...,
> > result: typing.Optional[str] = ...) -> typing.Callable[...,
> > typing.Optional[str]]: ...
> > ```
> >
> > Which is an incorrect annotation given that this function is a decorator (it
> > should return a function that takes a function and returns a function).
> >
> > In PyQt6 this is currently correctly annotated as returning a function that
> > takes a function and returns a function with the same signature:
> >
> > ```python
> > FuncT = typing.TypeVar('FuncT', bound=typing.Callable)
> > def pyqtSlot(*types, name: typing.Optional[str] = ..., result:
> > typing.Optional[str] = ...) -> typing.Callable[[FuncT], FuncT]: ...
> > ```
> >
> > It would be great if you could fix the stub file in PyQt5.
>
> For what it's worth, here is where we ended up in PyQt5-stubs.  I know there were some aspects of signals and slots that I didn't quite get how I wanted, but I think we got the first layers anyways.
>
> https://github.com/python-qt-tools/PyQt5-stubs/blob/50475496654268dfe9f2b1755b6270a619e4f339/PyQt5-stubs/QtCore.pyi#L13119
>
> @typing.overload
> def pyqtSlot(*types: typing.Any) -> typing.Callable[[FuncT[T]], FuncT[T]]: ...
> @typing.overload
> def pyqtSlot(*types: typing.Any, name: str) -> typing.Callable[[FuncT[T]], FuncT[T]]: ...
> @typing.overload
> def pyqtSlot(*types: typing.Any, result: typing.Type[T]) -> typing.Callable[[FuncT[T]], FuncT[T]]: ...
>
> <etc>
>
> We aren't particularly active these days, but there were a lot of improvements made in PyQt5-stubs for the hints.
>
> Cheers,
> -kyle

Thanks, I wasn't aware of this stub package.

Alexander


More information about the PyQt mailing list