Python 3: перезапустить текущую функцию без петли - PullRequest
0 голосов
/ 18 апреля 2020

У меня есть функция под названием Cycle(), которая регулирует скорость вращения насоса в зависимости от температуры. Вот его представление:

def Cycle(self, arg1, arg2, arg3, arg4):
   if arg1 < arg2:
       self.pumpSpeed = 100
   elif ....:
       print("Successfully cooled down. Returning to normal")
   elif ....:
       self.pumpSpeed = 45
   elif ....:
       print("Solar circuit cooled down. Returning to normal")
   elif ....:
       self.pumpSpeed = 0
   .
   .
   so on...

Вы можете видеть, что в некоторых условиях устанавливается PumpSpeed, в то время как в других просто предоставляется оператор печати, и система должна ждать следующего цикла, чтобы решить, что PumpSpeed должно быть.

Способ запуска следующий:

for i in range(0,10):
    fetchNewArgs()
    Obj.cycle(arg1, arg2, arg3, arg4)
    sleep(5)

Проблема в системе приходится ждать еще 5 секунд, чтобы решить, что новая скорость насоса после охлаждения должна составлять .

Решение должно включать continue в необходимых условиях, но проблема в том, что это не так oop, поэтому не может.

Есть ли способ запустить функцию Cycle() сразу, только в определенных условиях, не дожидаясь еще 5 секунд?

На основании ответов @ Quamrana нужно немного ограничить область действия:

  1. Время ожидания является переменным и не всегда 5, поэтому часть времени возврата увеличивается сложность. Если бы это было не так, то определенно это сработало бы.
  2. Важная вещь, которая, очевидно, не была ясна в первом утверждении. Причина, по которой я использовал слово Rerun, заключается в том, что я хочу использовать цикл с теми же аргументами. В следующий раз аргументы могли измениться. Пересмотрели оригинальную функцию l oop, чтобы продемонстрировать это.

Ответы [ 3 ]

1 голос
/ 18 апреля 2020

Другой вариант - вернуть bool для сна:

def Cycle(self, arg1, arg2, arg3, arg4):
    do_sleep = True
    # ...
    elif ...:
        do_sleep = False
    # ...
    return do_sleep

for i in range(0,10):
    if Obj.cycle(arg1, arg2, arg3, arg4):
        sleep(5)
1 голос
/ 18 апреля 2020

Изменив природу вопроса, сама функция может быть изменена на l oop:

def Cycle(self, arg1, arg2, arg3, arg4):
    do_loop = True
    while do_loop
        # ...
        elif ...:
            do_loop = False
        # ...

Вышеописанное работает, когда для большинства маршрутов требуется al oop. В качестве альтернативы, если большинство хочет выйти, флаг do_loop можно сбросить в пределах l oop:

def Cycle(self, arg1, arg2, arg3, arg4):
    do_loop = True
    while do_loop
        do_loop = False
        # ...
        elif ...:
            do_loop = True
        # ...
0 голосов
/ 18 апреля 2020

Один из вариантов - вернуть значение за sleep из метода cycle:

def Cycle(self, arg1, arg2, arg3, arg4):
    default_sleep_time = 5
    # ...
    elif ...:
        default_sleep_time = 0.001  # very short sleep
    # ...
    return default_sleep_time

for i in range(0,10):
    sleep_time = Obj.cycle(arg1, arg2, arg3, arg4)
    sleep(sleep_time)
...