Python laufende Function in anderer Function beenden?
(Ich bin komplett neu in Python)
Hey Leute,
mein Code sieht ungefähr so aus:
Am Anfang des Codes gehe ich in einer der beiden Funktionen, je nachdem ob die Variable "isit" True oder False ist.
Mal angenommen ich bin in der Funktion "isitfalse()". Mit der Funktion "pingip()" überprüfe ich, ob eine Spezielle IP erreichbar ist. Wenn nicht, setzt die Funktion die Variable "isit" auf False und die Funktion läuft erneut durch. Solange, bis der Wert auf True geht. Dann wird die Funktion "isittrue()" aufgerufen. Und da halt dann wieder das selbe Spiel.
(Ich hoffe wirklich sehr, man versteht was ich meine. Besser kann ich es leider nicht erklären)
Nun meine Frage, wenn die Funktionen sich mehrmals gegenseitig aufrufen, weil sich der Wert in der Variable "isit" ändert, starten sich dann sozusagen mehrere Instanzen der Funktion? Die Funktionen werden ja nie beendet. Die springen ja immer hin und her.
3 Antworten
Naja, mit jedem Aufruf wächst der Stack bis er irgendwann platzt.
Es ist hier auch völlig unnötig, daß die beiden Funktionen sich gegenseitig aufrufen.
state=false # false entspreche offline...
while True:
pingip()
if active and state==false:
#ip ist aktiv war zuvor inaktiv
if not active and state==true:
# ip ist inaktiv, war zuvor aktiv ....
sleep() #schnarchen bis zum nächsten Test
Nebenbei: Das pass ist bei Dir ohne Bedeutung.
active ist einfach das Ergebnis des Pings, also ob eien Antwort kam., z.B. könnte das so aussehen:
active=pingip()
wenn pingip() das entsprechend als boolean zurückgibt.
Und noch vergessen, am Ende des jeweiligen BRanches sollte noch ein:
state=not state
state ist dadurch quasi wie ein Schalter, der immer hin udn her geschaltet wird.
Ahh, verstehe. Danke dir, dass sollte das Problem gelöst haben. Probiere ich nachher gleich aus :)
Funktioniert einwandfrei, danke :D
Ja, das ist wie eine rekursive Funktion, die sich unendlich lang selber aufruft.
Eine Möglichkeit das zu beenden, wäre sicherlich schlau, oder immerhin das Ganze in eine einzige Funktion zu packen.
Gibt es denn vielleicht die Möglichkeit, in der Funktion "isittrue()" die Funktion "isitfalse()" zu beenden?
Nein, das geht hinsichtlich der Programmierung nicht, du könntest sie lediglich ineinander einbauen, so dass es eins wird.
a) Du beendest die Anwendung mit sys.exit. 😉
b) Wenn isittrue einen Zustand ändern würde, auf den isitfalse hin zum Ende kommt, ja. Ein einfaches Beispiel:
def run():
number = generateRandomNumber()
if number == 1:
return
run()
def generateRandomNumber():
# return random number between 0 and 10 ...
Wenn die Funktion generateRandomNumber den Wert 1 zurückgibt, ist sie indirekt dafür verantwortlich, der Funktion run (bzw. den dazu gerade laufenden Kontext) einen Grund gegeben zu haben, sich zu beenden.
Die weiteren Kontextblöcke werden in diesem Fall im weiteren Verlauf des Programmflusses auch geschlossen (Rekursion / rekursives Verhalten).
Also würden die sich dann sozusagen "stapeln"? Bis dann irgendwann 100 oder mehr von den Funktionen laufen?
Jeder Funktionsaufruf öffnet einen neuen Kontext.
Da deine Funktionen dieselbe Variable bearbeiten sollen, solltest du diese auch global anlegen und mit dem global-Keyword arbeiten. Lies dazu hier.
Wenn sich Funktionen gegenseitig ständig neu aufrufen, ohne das Aussicht auf einen Abbruch dieses Zustands besteht, kann es zu einem Laufzeitfehler führen.
Danke dir. Was genau ist dieses "active"? Muss ich das irgendwo Deklarieren oder muss ich dafür etwas importieren?