Details
-
Bug
-
Resolution: Fixed
-
P3: Somewhat important
-
6.8.0, 6.8.0.1, 6.8.0.2
-
None
-
34110468c (dev), 2b9e06b65 (6.8)
Description
Problem:
Although the PySide6 documentation correctly states that QModelIndex and QPersistentModelIndex objects can be compared with each other, the type hints for these classes do not include the ne, lt, le, eq, gt, or ge dunder methods.
For reference, here is the current QModelIndex type stub as of 6.8.0.1:
class QModelIndex(Shiboken.Object): @typing.overload def __init__(self) -> None: ... @typing.overload def __init__(self, QModelIndex: PySide6.QtCore.QModelIndex) -> None: ... @staticmethod def __copy__() -> None: ... @staticmethod def __repr__() -> str: ... def column(self) -> int: ... def const_internal_pointer(self) -> int: ... def data(self, role: int = ...) -> typing.Any: ... def flags(self) -> PySide6.QtCore.Qt.ItemFlag: ... def internal_id(self) -> int: ... def internal_pointer(self) -> typing.Any: ... def is_valid(self) -> bool: ... def model(self) -> PySide6.QtCore.QAbstractItemModel: ... def multi_data(self, roleDataSpan: PySide6.QtCore.QModelRoleDataSpan | PySide6.QtCore.QModelRoleData) -> None: ... def parent(self) -> PySide6.QtCore.QModelIndex: ... def row(self) -> int: ... def sibling(self, row: int, column: int) -> PySide6.QtCore.QModelIndex: ... def sibling_at_column(self, column: int) -> PySide6.QtCore.QModelIndex: ... def sibling_at_row(self, row: int) -> PySide6.QtCore.QModelIndex: ...
Impact:
The missing comparison type hints result in type checkers falsely indicating that QModelIndex and QPersistentModelIndex cannot be compared successfully:
Condition will always evaluate to False since the types "QModelIndex" and "QPersistentModelIndex" have no overlap Pylance(reportUnnecessaryComparison) |
Proposed Solution:
Based on the type signatures shown in the PySide6 documentation, this type error could be fixed by modifying the QModelIndex and QPersistentModelIndex classes as shown:
class QModelIndex(Shiboken.Object): @typing.overload def __init__(self) -> None: ... @typing.overload def __init__(self, QModelIndex: PySide6.QtCore.QModelIndex) -> None: ... def __ne__(self, rhs: PySide6.QtCore.QModelIndex | PySide6.QtCore.QPersistentModelIndex) -> bool: ... def __lt__(self, rhs: PySide6.QtCore.QModelIndex | PySide6.QtCore.QPersistentModelIndex) -> bool: ... def __le__(self, rhs: PySide6.QtCore.QModelIndex | PySide6.QtCore.QPersistentModelIndex) -> bool: ... def __eq__(self, rhs: PySide6.QtCore.QModelIndex | PySide6.QtCore.QPersistentModelIndex) -> bool: ... def __gt__(self, rhs: PySide6.QtCore.QModelIndex | PySide6.QtCore.QPersistentModelIndex) -> bool: ... def __ge__(self, rhs: PySide6.QtCore.QModelIndex | PySide6.QtCore.QPersistentModelIndex) -> bool: ... @staticmethod def __copy__() -> None: ... @staticmethod def __repr__() -> str: ... def column(self) -> int: ... def const_internal_pointer(self) -> int: ... def data(self, role: int = ...) -> typing.Any: ... def flags(self) -> PySide6.QtCore.Qt.ItemFlag: ... def internal_id(self) -> int: ... def internal_pointer(self) -> typing.Any: ... def is_valid(self) -> bool: ... def model(self) -> PySide6.QtCore.QAbstractItemModel: ... def multi_data(self, roleDataSpan: PySide6.QtCore.QModelRoleDataSpan | PySide6.QtCore.QModelRoleData) -> None: ... def parent(self) -> PySide6.QtCore.QModelIndex: ... def row(self) -> int: ... def sibling(self, row: int, column: int) -> PySide6.QtCore.QModelIndex: ... def sibling_at_column(self, column: int) -> PySide6.QtCore.QModelIndex: ... def sibling_at_row(self, row: int) -> PySide6.QtCore.QModelIndex: ...
Attachments
For Gerrit Dashboard: PYSIDE-2915 | ||||||
---|---|---|---|---|---|---|
# | Subject | Branch | Project | Status | CR | V |
602612,2 | type hints: Support rich compare functions | dev | pyside/pyside-setup | Status: MERGED | +2 | 0 |
602750,2 | type hints: Support rich compare functions | 6.8 | pyside/pyside-setup | Status: MERGED | +2 | 0 |