Returns the edge connecting the nodes with the specified names if such an edge exists.

        Arguments:
            source_name (str): The name of one of the endpoints of queried edge.
            target_name (str): The name of the other endpoint of the queried edge.

        Returns:
            The edge connecting the nodes with the specified names
            or `None` if no such node exists.

def get_edge_by_name(self, source_name: str, target_name: str) -> Optional[Edge]:
        """
        Returns the edge connecting the nodes with the specified names if such an edge exists.

        Arguments:
            source_name (str): The name of one of the endpoints of queried edge.
            target_name (str): The name of the other endpoint of the queried edge.

        Returns:
            The edge connecting the nodes with the specified names
            or `None` if no such node exists.
        """
        nodes: NodeList = self._graph.nodes
        source: Optional[Node] = nodes.get_node_by_name(source_name)
        if source is None:
            return None
        target: Optional[Node] = nodes.get_node_by_name(target_name)
        if target is None:
            return None
        return self.get_edge_by_index(source.index, target.index)