← Назад к вопросам
Как сравнить два объекта, если они переданы в виде edge?
2.0 Middle🔥 51 комментариев
#Python Core
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Сравнение объектов, переданных в виде edge
Когда мы работаем с GraphQL и граф-структурами, объекты часто передаются в виде edge — специальной обёртки вокруг объекта, которая может содержать дополнительный контекст (например, метаданные о позиции в листе, курсор для пагинации).
Что такое Edge
# Типичная структура Edge в GraphQL
class Edge:
def __init__(self, node, cursor=None):
self.node = node # Сам объект
self.cursor = cursor # Курсор для пагинации
Вариант 1: Сравнение узлов (node)
Если нужно сравнить содержимое объектов, игнорируя метаданные:
def compare_edges(edge1, edge2):
"""Сравнивает node'ы двух edge'ей"""
return edge1.node == edge2.node
# Использование
edge1 = Edge(node=User(id=1, name="Alice"))
edge2 = Edge(node=User(id=1, name="Alice"))
if compare_edges(edge1, edge2):
print("Объекты одинаковые")
Вариант 2: Полное сравнение edge'ей
Если важны все атрибуты, включая cursor:
def compare_edges_full(edge1, edge2):
"""Сравнивает edge'ы полностью"""
return (edge1.node == edge2.node and
edge1.cursor == edge2.cursor)
Вариант 3: Сравнение по ID (для больших объектов)
Для оптимизации памяти и скорости:
def compare_edges_by_id(edge1, edge2):
"""Сравнивает edge'ы по ID узлов"""
return edge1.node.id == edge2.node.id
Вариант 4: Использование eq в классе
class Edge:
def __init__(self, node, cursor=None):
self.node = node
self.cursor = cursor
def __eq__(self, other):
if not isinstance(other, Edge):
return False
# Сравниваем только node по умолчанию
return self.node == other.node
def __hash__(self):
return hash(id(self.node))
# Теперь можно использовать обычное сравнение
edge1 = Edge(node=User(id=1))
edge2 = Edge(node=User(id=1))
assert edge1 == edge2
Вариант 5: Работа со списками edge'ей
def compare_edge_lists(edges1, edges2):
"""Сравнивает списки edge'ей"""
if len(edges1) != len(edges2):
return False
return all(e1.node == e2.node for e1, e2 in zip(edges1, edges2))
# Или с set (если порядок не важен)
def compare_edge_sets(edges1, edges2):
"""Сравнивает edge'ы как множество"""
return {e.node.id for e in edges1} == {e.node.id for e in edges2}
Практический пример с GraphQL
from dataclasses import dataclass
@dataclass
class User:
id: int
name: str
def __eq__(self, other):
return isinstance(other, User) and self.id == other.id
class Edge:
def __init__(self, node, cursor=None):
self.node = node
self.cursor = cursor
def __eq__(self, other):
if not isinstance(other, Edge):
return False
return self.node == other.node
# Использование
user1 = User(id=1, name="Alice")
user2 = User(id=1, name="Alice")
edge1 = Edge(node=user1, cursor="abc123")
edge2 = Edge(node=user2, cursor="xyz789")
print(edge1 == edge2) # True (node'ы одинаковые)
Рекомендации
- Игнорируй cursor при сравнении, если это не критично для бизнес-логики
- Используй eq и hash для корректной работы в set'ах и dict'ах
- Сравнивай по ID, если объекты большие и часто изменяются
- Тестируй граничные случаи: None, пустые списки, циклические ссылки