Как правильно реализовать бесконечные циклы while в Python? - PullRequest
0 голосов
/ 29 января 2020

Я создаю программу, которая позволяет пользователю login, create или restore их учетной записи, используя клавиши 1, 2 и 3.

Модуль mainf просит пользователя выбрать опцию, которая затем вызывает функцию из другого модуля.

mainf module:

import createnewaccount
import loginf
import restoreaccount


def main():
    options = {
        "LOGIN": 1,
        "CREATE NEW ACCOUNT": 2,
        "RESTORE ACCOUNT": 3,
    }

    print("------------------------")
    for options, choices in options.items():
        print(options + ' - ' + str(choices))
    print("------------------------")

    while True:
        try:
            user_option = (input("Select an option 1-3: \n"))
            user_option = int(user_option)
            if user_option < 1 or user_option > 3:
                raise Exception
        except ValueError:
            print("Invalid response.")
        except Exception:
            print("Invalid option.")
        else:
            return user_option


user_ = main()

if user_ == 1:
    loginf.login_information()
if user_ == 2:
    createnewaccount.main()
if user_ == 3:
    restoreaccount.main()

if __name__ == '__main__':
    while True:
        main()

Чтобы отладить мой код, я удалил все в моем модуле loginf и разрешил ему только return "Hello".

loginf module:

def login_information():
    return print("Hello")

Пользователь должен получать "Hello" каждый раз, когда они выбрали ключ 1. Однако вместо этого это мой вывод:

C:\Users\raamis\PycharmProjects\test\venv\Scripts\python.exe C:/Users/raamis/PycharmProjects/test/mainf.py
------------------------
LOGIN - 1
CREATE NEW ACCOUNT - 2
RESTORE ACCOUNT - 3
------------------------
Select an option 1-3: 
1
Hello
------------------------
LOGIN - 1
CREATE NEW ACCOUNT - 2
RESTORE ACCOUNT - 3
------------------------
Select an option 1-3: 
1
------------------------
LOGIN - 1
CREATE NEW ACCOUNT - 2
RESTORE ACCOUNT - 3
------------------------
Select an option 1-3: 

Ответы [ 2 ]

0 голосов
/ 29 января 2020

Это потому, что «если условия» не в бесконечном l oop, они просто выполняются один раз при запуске файла.

Вы можете достичь ожидаемого результата, поставив бесконечные условия, если l oop, как указано ниже -

if __name__ == '__main__':
    while True:
        user_ = main()

        if user_ == 1:
            loginf.login_information()
            print("inside ")
        if user_ == 2:
            createnewaccount.main()
        if user_ == 3:
            restoreaccount.main()
0 голосов
/ 29 января 2020

Когда вы запускаете модуль через командную строку, сначала выполняются эти инструкции:

user_ = main()

if user_ == 1:
    loginf.login_information()
if user_ == 2:
    createnewaccount.main()
if user_ == 3:
    restoreaccount.main()

, что объясняет, что «Hello» печатается (как и ожидалось) в первый раз.

Затем выполняются следующие инструкции:

while True:
    main()

, что объясняет, что «Hello» НЕ печатается в следующий раз, потому что loginf.login_information() здесь не вызывается.

Я предлагаю вам следующее исправление:

import createnewaccount
import loginf
import restoreaccount


def get_option():
    options = {
        "LOGIN": 1,
        "CREATE NEW ACCOUNT": 2,
        "RESTORE ACCOUNT": 3,
    }

    print("------------------------")
    for options, choices in options.items():
        print(options + ' - ' + str(choices))
    print("------------------------")

    while True:
        try:
            user_option = (input("Select an option 1-3: \n"))
            user_option = int(user_option)
            if user_option < 1 or user_option > 3:
                raise Exception
        except ValueError:
            print("Invalid response.")
        except Exception:
            print("Invalid option.")
        else:
            return user_option

def main():
    user_ = get_option()

    if user_ == 1:
        loginf.login_information()
    if user_ == 2:
        createnewaccount.main()
    if user_ == 3:
        restoreaccount.main()

if __name__ == '__main__':
    while True:
        main()
...