Search code examples
pythonprintingreturnreturn-valuedijkstra

Returning a value from a function failed with NoneType


I have a problem with returning a value from an external function.

Function:

def dijkstra(netzwerk,startpunkt,zielpunkt,punkt_geprueft=[],entfernungen={},vorgaenger={}):
    if startpunkt not in netzwerk:
        raise TypeError('Start- und/oder Zielpunkt nicht vorhanden')
    if zielpunkt not in netzwerk:
        raise TypeError('Zielpunkt kann nicht gefunden werden')
    if startpunkt == zielpunkt:
        weg_pfad=[]
        variable_fuer_vorgaenger=zielpunkt
        while variable_fuer_vorgaenger != None:
            weg_pfad.append(variable_fuer_vorgaenger)
            variable_fuer_vorgaenger=vorgaenger.get(variable_fuer_vorgaenger,None)
        return weg_pfad
        #print(weg_pfad)
    else :
        if not punkt_geprueft:
            entfernungen[startpunkt]=0
        for nachbarpunkt in netzwerk[startpunkt] :
            if nachbarpunkt not in punkt_geprueft:
                neue_entfernung = entfernungen[startpunkt] + netzwerk[startpunkt][nachbarpunkt]
                if neue_entfernung < entfernungen.get(nachbarpunkt,float('inf')):
                    entfernungen[nachbarpunkt] = neue_entfernung
                    vorgaenger[nachbarpunkt] = startpunkt
        punkt_geprueft.append(startpunkt)
        ungeprueft={}
        for k in netzwerk:
            if k not in punkt_geprueft:
                ungeprueft[k] = entfernungen.get(k,float('inf'))
        nd= min(ungeprueft, key=ungeprueft.get)
        dijkstra(netzwerk,nd,zielpunkt,punkt_geprueft,entfernungen,vorgaenger)

Main function:

startpunkt = self.dlg.DStart.text()
zielpunkt = self.dlg.DEnd.text()
weg_pfad = dijkstra(netzwerk, startpunkt, zielpunkt)
print(weg_pfad)
self.dlg.OutputText.append(weg_pfad)
self.dlg.OutputText.append("Ergebnis für Dijkstra Algorithmus")

Printing the value weg_pfad in the function gives me a value: ['P5', 'P3']. Printing the value in the main function gives me None.

Why is this and how can I fix it?

The next step is returning multiple values -> weg_pfad and entfernungen[zielpunkt].


Solution

  • You call your dijkstra function multiple times. So while it returns some value when you finally find the solution, all the intermediary calls that entered the "else" clause will end without any return statement, thus returning default of None.

    You need to pass your final value all the way up to the top of the calling chain by using return with the recursive call of your function.