Реализация «Нажмите любую клавишу, чтобы остановить обновление» l oop in Python - PullRequest
1 голос
/ 03 августа 2020

Как лучше всего реализовать бесконечное l oop в Python, чтобы заданная функция запускалась снова и снова, пока пользователь не нажмет клавишу? Я могу придумать пару способов сделать это, один из которых включает Ctrl- C, а другой включает многопоточность: оба кажутся чрезвычайно хакерскими и оставляют у меня ощущение, что я упускаю что-то ослепляюще очевидное.

Вот минимальный рабочий пример метода Ctrl- C :

def run():
    my_object = MyClass()
    my_object.lay_the_table()
    print("Telling my_object to keep refreshing... Use Ctrl-C to stop.")
    while True:
        my_object.refresh()
    my_object.tidy_away()

if __name__ == "__main__":
    run()

Очевидно, что недостатки этого метода:

  • tidy_away() метод никогда не вызывается.
  • Я не могу себе представить, что когда-либо будет хорошей практикой предложить пользователю убить программу вручную.

Но что может быть лучше?

Я очень удивлен, что не могу найти вопрос, похожий на этот - для Python - в Stack Overflow. Опять же, вполне возможно, что я просто неправильно использую функцию поиска! Рад, что этот вопрос помечен как повторяющийся, если он указывает мне на решение.

Ответы [ 2 ]

2 голосов
/ 03 августа 2020

Использование Ctrl + C нормально, но вы должны использовать обработку исключений. Перехватите KeyboardInterrupt и используйте finally для определения действий по очистке.

def run():
    my_object = MyClass()
    my_object.lay_the_table()
    print("Telling my_object to keep refreshing... Use Ctrl-C to stop.")
    try:
        while True:
            my_object.refresh()
    except KeyboardInterrupt:
        pass
    finally:
        my_object.tidy_away()

if __name__ == "__main__":
    run()

Так как Ctrl + C отправляет прерывание, это, наверное, самый простой способ сделать это.

1 голос
/ 03 августа 2020

Чтобы реализовать бесконечный цикл l oop, который выходит из l oop, если вы удовлетворяете условию, просто:

while True:
    run()
    if exitcondition == True:
        break

это будет l oop функция бесконечно, пока условие выхода не будет встретился, то он выйдет из l oop. если вы хотите, чтобы программа завершилась после условия выхода, замените «break» на quit ().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...