Сравнить объекты и поиск по списку - PullRequest
1 голос
/ 27 мая 2019

Я использую Python 3 и PySide2 (Qt для Python) (обе версии).У меня есть список объектов PySide2 и я должен проверить, существует ли элемент в списке.Если я пытаюсь это сделать, я получаю сообщение об ошибке:

NotImplementedError: operator not implemented.
from PySide2 import QtGui
item = QtGui.QStandardItem()
item1 = QtGui.QStandardItem()

item == item1 # creates error

list1 = [item, item1]
item1 in list1 # creats error

Что я не так делаю?Как я могу это сделать?Нужно ли самому реализовывать оператор "=="?Заранее благодарю за помощь!

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

Как отмечено в комментарии, ошибка, которую вы получаете, является частью ошибки , которая является остатками PySide.

Я думаю, что у вас есть проблема XY и вы хотите проверить, есть ли элемент с предопределенным текстом.Если это так, то нет необходимости реализовывать оператор ==, но использовать метод findItems () :

from PySide2 import QtCore, QtGui

if __name__ == "__main__":
    import sys

    md = QtGui.QStandardItemModel()
    for text in ("Hello", "Stack", "Overflow"):
        md.appendRow(QtGui.QStandardItem(text))

    words = ("Hello", "World")

    for word in words:
        if md.findItems(word, flags=QtCore.Qt.MatchExactly, column=0):
            print(f"{word} exists")
        else:
            print(f"{word} not exists")

Или использовать метод match () если вы хотите найти другую роль:

from PySide2 import QtCore, QtGui

FooRole = QtCore.Qt.UserRole + 1000

if __name__ == "__main__":
    import sys

    md = QtGui.QStandardItemModel()
    for i, text in enumerate(("Hello", "Stack", "Overflow")):
        it = QtGui.QStandardItem(str(i))
        it.setData(text, FooRole)
        md.appendRow(it)

    words = ("Hello", "World")

    for word in words:
        if md.match(
            md.index(0, 0), FooRole, word, hits=1, flags=QtCore.Qt.MatchExactly
        ):
            print(f"{word} exists")
        else:
            print(f"{word} not exists")
0 голосов
/ 27 мая 2019

Оператор == эквивалентен __eq__. Использование как a.__eq__(b) или a == b. И исключение говорит о том, что класс не имеет реализации этого метода.

И документ говорит:

Оператор переопределения, если вы хотите контролировать семантику сравнения элементов. Оператор определяет отсортированный порядок при сортировке элементов с помощью sortChildren() или sort().

...