Python laufende Function in anderer Function beenden?

3 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

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.

ilovepepegas 
Fragesteller
 22.07.2020, 13:16

Danke dir. Was genau ist dieses "active"? Muss ich das irgendwo Deklarieren oder muss ich dafür etwas importieren?

0
KarlRanseierIII  22.07.2020, 13:18
@ilovepepegas

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.

1
ilovepepegas 
Fragesteller
 22.07.2020, 13:24
@KarlRanseierIII

Ahh, verstehe. Danke dir, dass sollte das Problem gelöst haben. Probiere ich nachher gleich aus :)

0

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.

Woher ich das weiß:Berufserfahrung – Programmierer
ilovepepegas 
Fragesteller
 21.07.2020, 19:39

Also würden die sich dann sozusagen "stapeln"? Bis dann irgendwann 100 oder mehr von den Funktionen laufen?

0
ilovepepegas 
Fragesteller
 21.07.2020, 19:43

Gibt es denn vielleicht die Möglichkeit, in der Funktion "isittrue()" die Funktion "isitfalse()" zu beenden?

0
Ecaflip  21.07.2020, 19:50
@ilovepepegas

Nein, das geht hinsichtlich der Programmierung nicht, du könntest sie lediglich ineinander einbauen, so dass es eins wird.

1
regex9  21.07.2020, 20:32
@ilovepepegas

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).

1

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.

ilovepepegas 
Fragesteller
 21.07.2020, 20:05

Danke dir, da werde ich mal reinschauen :)

0