#python #class #list-comprehension
Вопрос:
В настоящее время я застрял, и я надеюсь, что кто-нибудь здесь сможет мне помочь. Я пытаюсь добиться следующего: у меня есть два API, каждый из которых предоставляет мне список учебных курсов, представленных в виде экземпляра класса python. С одной стороны, есть API MS Learn, и рабочий процесс заключается в том, что я получаю их, сопоставляю данные и вставляю их в свою базу данных. Но прежде чем я это сделаю, я хочу проверить наличие 1.) дублированных курсов и 2.) если есть дубликат — может быть, он новее, чем мой сохраненный курс в моей базе данных? И 3.) Есть ли у меня в базе данных курсы, которых нет в списке курсов MS Learn?
Атрибуты, которые мне нужно проверить, — это «Идентификатор ссылки» для дураков / несуществующих курсов на внешней стороне и «created_at», если что-то новее / старше. Вместо диких циклов и сохранение значений в другой список, который я хотел бы использовать что-то более чистое и обновления, как пользовательский эквалайзер функция, а затем сравнение двух списков класса и объектов учета 1. все новые курсы, удаляя дубликаты из списка и 2. разница в том, что не существует в списке внешних курсов, так что я могу удалить их
Извините за длинный текст, вот немного кода:
@dataclass
class Courses:
id: str
title: str
description: str
courseUrl: str
referenceId: str
providerId: int
publishingState: str
createdAt: str
updatedAt: str
Первая попытка пользовательской функции эквалайзера — никогда не использовал ее до idk, если это сработает:
def __eq__(self, other):
if isinstance(other, Courses):
return self.title == other.title
and self.description == other.description
and self.courseUrl == other.courseUrl
and self.referenceId == other.referenceId
and self.providerId == other.providerId
and self.publishingState == other.publishingState
and self.createdAt == other.createdAt
and self.updatedAt == other.updatedAt
return False
Первое начало моего циклического хаоса:
internal_courses = get_courses(request)
internal_reference_ids = []
duplicated_courses = []
for int_course in internal_courses:
internal_reference_ids.append(int_course.referenceId)
for ext_course in external_courses:
if ext_course.referenceId in internal_reference_ids:
duplicated_courses.append(ext_course)
external_courses.remove(ext_course)
Заранее большое вам спасибо, мне не терпится узнать что-то новое 🙂
Ответ №1:
Определенный вами __eq__
метод позволяет сравнивать экземпляры классов, подобные этому:
if course_a == course_b:
# Do something
При сравнении двух списков вместо этого вы вызываете list.__eq__
метод. Если этот список содержит объекты ваших курсов (кстати, вы должны использовать единственную форму, так как это один курс), они будут сравниваться с использованием определенного __eq__
вами метода.
Это означает, что вы можете просто сравнить [course_a, course_b] == [course_a, course_c]
, и это должно работать так, как вы задумали.
class Example:
def __init__(self, arg1, arg2):
self.arg1 = arg1
self.arg2 = arg2
def __eq__(self, other):
return self.arg1 == other.arg1 and self.arg2 == other.arg2
# Initialize two instances with identical arguments.
one = Example('x', 'y')
two = Example('x', 'y')
print(one == two) # True
a = [one]
b = [two]
print(a == b) # Also True
P.S.
Проверьте @dataclass(eq=True)
, так как это делает почти то же самое