Проверка наличия ключа в OrderedDict

Я имею дело с миграцией кода с python2 на python3. У меня нет большого опыта работы с ООП и OrderedDict в питоне. Вот проблема, которую я не могу решить. Подобные вопросы задавались раньше, но, похоже, в этом случае ничего не работает. У меня есть следующий код:

for row in rows:
    new_ = dummy(row.attr, row.error_type, row.array_agg_1,
                   row.with_error, row.total, row.level, row.order_)

    if new_ in result[n.id]: # <- never becomes true
         print('I am in the if')
         if new_.with_error is not None:
             result[n.id][new_][1] += new_.with_error
             result['total'][new_][1] += new_.with_error
    else:
         print('I am in the else')
         if new_.with_error is not None:
             result[n.id][new_] = [new_.attr, new_.with_error]

Этот код работает в python2. Однако версия python3 не может выполнить внешний оператор if.

result[n.id] это OrderedDict выглядит так:

#an example of result[n.id]
>>> ([(Eclipse Required Items'nce'[1540972], ['Eclipse Required Items', 1, 1, [1540972], 'nce', 1, 1681]), 
(Other Story Tab Info learned/discovered documentation and accuracy'nce'[1540973], ['Other Story Tab Info learned/discovered documentation and accuracy', 1, 1, [1540973], 'nce', 1, 1684]),
(Other (please provide detail in Comments section)'bce'[1541001], ['Other (please provide detail in Comments section', 1, 1, [1540973], 'bce', 1, 1684]
(Other Static bar information was documented'nce'[1540974], ['Other Static bar information was documented', 1, 1, [1541001], 'nce', 1, 1707])])

#type of result[n.id]
>>> <class 'collections.OrderedDict'>

new_ выглядит так:

#print(new_)
Other (please provide detail in Comments section)'bce'[1541001]

#print(type(new_))
<class 'smd.lib.asynch.calibration.dummy'>

Вещи, которые я пробовал

if str(new_) in str(result[n.id]):

Это работает, но не работает внутри с KeyError, и я не уверен, что это лучший способ сделать это. Кроме того, это может нарушить другие функции программного обеспечения.

if new_ in result[n.id].keys():

не работает. Любая помощь и указания по решению проблемы будут действительно оценены.

dummy класс выглядит так:

class dummy(object):

    def __init__(self, attr, error_type, path, with_error=None, total=None,
                 level=None, order=None):
        self.attr = attr
        self.error_type = error_type
        self.path = path
        self.with_error = with_error
        self.total = total
        self.level = level
        self.order = order

    def __cmp__(self, other):
        return not (
            self.attr == other.attr and self.error_type == other.error_type
            and self.path == other.path
        )

    def __base_repr__(self):
        return "{0}{1}{2}".format(self.attr, self.error_type, self.path)

    def __hash__(self):
        return hash(self.__base_repr__())

    def __repr__(self):
        return self.__base_repr__()

Удалите __cmp__ и вместо этого внедрите __eq__.

balderman 19.12.2020 20:01

@balderman спасибо за понимание. Я посмотрю на это. Не могли бы вы предложить хороший ресурс для обучения? это хороший ресурс?

Grayrigel 19.12.2020 20:07

см. stackoverflow.com/questions/4901815/…

balderman 19.12.2020 20:10

@balderman Спасибо за помощь. это работает сейчас. Не могли бы вы написать ответ? Я хотел бы принять и закрыть вопрос.

Grayrigel 19.12.2020 20:22

Рад помочь. Был написан ответ.

balderman 19.12.2020 20:25
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
5
906
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

В Python 3 __cmp__ больше не используется. Вам нужно внедрить __eq__ в свой класс и удалить __cmp__

Другие вопросы по теме