Объект не вызывается?

#python #graph #typeerror #callable

#python #График #ошибка типа #вызываемый

Вопрос:

Привет всем, я не могу понять, как исправить эту проблему, и, насколько мне известно, это связано с атрибутами объекта, который я использую.

К вашему сведению, я создаю график на Python, и график должен проверять, соединены ли все вершины и ребра.

 class graph(object):

    def __init__(self, gdict=None):
        if gdict == None:
            gdict = {}
        self.gdict = gdict


    # return the keys of the dictionary list, or vertices
    def getVertice(self):
        return list(self.gdict.keys())

    # this allows us to obtain the edges for the graph
    # or "values" of the dict key
    def getEdges(self):
        return self.generate_edges()

    def addVertex(self, vertex):
        if vertex not in self.gdict:
            self.gdict[vertex] = []

    def addEdge(self, edge):
        edge = set(edge)
        (vertex1, vertex2) = tuple(edge)
        if vertex1 in self.gdict:
            self.gdict[vertex1].append(vertex2)
        else:
            self.gdict[vertex1] = [vertex2]

    # this generates a list of all edges for the vertices
    def generate_edges(self):
        edges = []
        for vertex in self.gdict:
            for neighbour in self.gdict[vertex]:
                if (neighbour, vertex) not in edges:
                    edges.append((vertex, neighbour))
        return edges

    def find_path(self, startVertex, endVertex, paths=None):
        if paths == None:
            paths = []
        graphs = self.gdict
        paths = paths   [startVertex]
        if startVertex == endVertex:
            return paths
        if startVertex not in graphs:
            return None
        for vertex in graphs[startVertex]:
            if vertex not in paths:
                extendedPath = self.find_path(vertex, endVertex, paths)

                if extendedPath:
                    return extendedPath
        return None

    def findAllPath(self, startVertex, endVertex, paths=None):
        if paths is None:
            paths = []
        graphs = self.gdict
        paths = paths   [startVertex]
        if startVertex == endVertex:
            return [paths]
        if startVertex not in graphs:
            return []
        paths = []
        for vertex in graphs[startVertex]:
            if vertex not in paths:
                extendedPath = self.find_path(vertex, endVertex, paths)
                for p in extendedPath:
                    paths.append(p)
            return paths

    def findisovertices(self):  ##reword this
        """ returns a list of isolated vertices. """
        graphs = self.gdict
        iso = []
        for vertex in graphs:
            print(iso, vertex)
            if not graphs[vertex]:
                iso  = [vertex]
        return iso

    def isConnected(self, verticesMet=None, startVertex=None):
        if verticesMet is None:
            verticesMet = set()
        gdict = self.gdict
        vertices = self.gdict()
        if not startVertex:
            startVertex = vertices[0]
        verticesMet.add(startVertex)
        if len(verticesMet) != len(vertices):
            for vertex in gdict[startVertex]:
                if vertex not in verticesMet:
                    if self.isConnected(verticesMet, vertex):
                        return True
        else:
            return True
        return False
    # this function prints the nodes/vertices in the graph
    def completeGraph(self):
        Vertex = len(self.gdict.keys())
        Edges = len(self.gdict.values())
        answer = 2.0 * Edges / (Vertex * (Vertex - 1))
        return answer

graph_elements = ({"a": ["d", "f"],
                   "b": ["c"],
                   "c": ["b", "c", "d", "e"],
                   "d": ["a", "c"],
                   "e": ["c"],
                   "f": ["a"],
                   "z": []
                   })

g = graph(graph_elements)

print("Our vertices are: n", g.getVertice())
print("#1 | Generate list of all edges: n", graph.generate_edges(g))

##2 Function to calculate isolated nodes of graph.
isolated = graph.findisovertices(g)
print("#2 | Find isolated nodes:n", isolated)

# 3.    Function to find a path from a start vertex to an end vertex
path = graph.find_path(g, "a", "c")
print("#3 | Find a path function: n", path)

# 4.    Function to find all the paths between a start vertex to an end vertex
allPaths = graph.findAllPath(g, "a", "e")
print("#4 | All paths function:n", allPaths)

# 5. Function to check if graph is connected
connect = graph(g)


print("#5 | Connected graph function n", connect.isConnected(g))
  

и я продолжаю получать следующую ошибку:

 Traceback (most recent call last):
  File "graphsAssign6.py", line 160, in <module>
    print("#5 | Connected graph function n", connect.isConnected(g))
  File "graphsAssign6.py", line 95, in isConnected
    vertices = self.gdict()
TypeError: 'graph' object is not callable
  

Комментарии:

1. Я смог запустить ваш код. Пожалуйста, убедитесь, что у вас нет других переменных с тем же именем, graph которые вызывают затенение объекта

2. Вы запускали его со своим собственным набором точек? Я не могу поверить, что это проблема, я плачу

3. Я запустил точно такой же код, который у вас есть выше!

4. Есть ли у вас в файле какой-либо другой фрагмент кода, который вы не вставили выше?

5. Это должно быть просто vertices = self.gdict

Ответ №1:

 def isConnected(self, verticesMet=None, startVertex=None):
    if verticesMet is None:
        verticesMet = set()
    gdict = self.gdict
    vertices = self.getVertice()
    if not startVertex:
        startVertex = vertices[0]
    verticesMet.add(startVertex)
    if len(verticesMet) != len(vertices):
        for vertex in gdict[startVertex]:
            if vertex not in verticesMet:
                if self.isConnected(verticesMet, vertex):
                    return True
    else:
        return True
    return False



# 5. Function to check if graph is connected
print("#5 | Connected graph function n", g.isConnected())
  

Не создавайте новый connect = graph(g) . Ваш isConnected должен работать в g. Кроме того, вы не должны получать свои вершины с помощью self.gdict() . Это не имеет смысла, и у вас уже есть функция с именем getVertice для этой работы.

Комментарии:

1. Почему бы и нет? OP создал график графика, выполнив connect = graph(g) . Для меня это не имеет особого смысла.

2. Ошибка self.gdict() в том, что я не понимаю, как создание нового connect = graph(g) связано с этим.

3. Большое вам спасибо! он действительно запустился, я думаю, что мой оператор печати был неправильным. Я пробовал функцию getVertice раньше, однако, поскольку я печатал ее неправильно, она все равно не работала.