PyQt6 v6.12.0 stubs - positional-only parameters missing "/"
Phil Thompson
phil at riverbankcomputing.com
Thu Oct 15 22:26:25 BST 2026
On 12/10/2026 21:18, Dragan A. wrote:
> Hi,
>
> One more stub issue, this time a general one.
>
> At runtime, PyQt methods don't accept required arguments as keywords:
>
> obj.eventFilter(a0=o, a1=e) -> TypeError: eventFilter() takes no
> keyword arguments
> obj.event(a0=e) -> TypeError: event() takes no
> keyword
> arguments
>
> But the stubs declare them as normal parameters, without "/":
>
> def eventFilter(self, a0: 'QObject|None', a1: 'QEvent|None') ->
> bool:
> ...
>
> Because of that, type checkers treat the names a0/a1 as part of the
> API, and
> every override that uses meaningful names is reported as incompatible
> (pyright 1.1.414):
>
> class Filter(QObject):
> def eventFilter(self, watched: QObject | None, event: QEvent |
> None) -> bool: ...
>
> error: Method "eventFilter" overrides class "QObject" in an
> incompatible manner
> Parameter 2 name mismatch: base parameter is named "a0", override
> parameter is named "watched"
>
> Users are forced to name their parameters a0, a1, ... or add ignore
> comments.
> The stubs themselves already contradict this: QObject.eventFilter uses
> (a0, a1), while some QtWidgets overrides use (watched, event), (object,
> event)
> or (o, e).
>
> The fix is to emit "/" after the arguments that can't be passed as
> keywords:
>
> def eventFilter(self, a0: 'QObject|None', a1: 'QEvent|None', /) ->
> bool: ...
> def event(self, a0: 'QEvent|None', /) -> bool: ...
>
> This matches the runtime behavior and lets subclasses use any parameter
> names.
> It applies to all generated methods, not only eventFilter.
>
> Best regards,
This will be fixed in the next SIP snapshot.
Thanks,
Phil
More information about the PyQt
mailing list