← Назад к вопросам

Как сравнить два объекта, если они переданы в виде 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, пустые списки, циклические ссылки