Проверка ввода с несколькими условиями - PullRequest
0 голосов
/ 11 июля 2019

Я пишу простую игру на Python, где пользователь вводит матричный элемент, определенный как row и column, разделенные пробелом. Я хочу проверить этот ввод.

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

player_choice = ["",""]
while True:
    player_choice = input("Enter the row and column of your choice separated by a space: ").split(" ")
    if len(player_choice) != 2:
        continue
    if not player_choice[0].isdigit() or not player_choice[1].isdigit():
        continue
    if int(player_choice[0]) <= 0 or int(player_choice[0]) > ROWS:
        continue
    if int(player_choice[1]) <= 0 or int(player_choice[1]) > COLUMNS:
        continue
    else:
        break

1 Ответ

1 голос
/ 11 июля 2019
while True:

Это никогда не замечательно и должно указывать на то, что есть лучший способ разработать этот код. Даже если он просто использует логический флаг.

if len(player_choice) != 2:
    continue
if not player_choice[0].isdigit() or not player_choice[0].isdigit():

Так, кроме очевидной опечатки, где второе предложение должно было быть player_choice[1], в python более идиоматично - try вместо if (https://devblogs.microsoft.com/python/idiomatic-python-eafp-versus-lbyl/).. Также рассмотрите возможность предоставления некоторой обратной связи с пользователем, так как (а) тот факт, что команда потерпела неудачу и (б) почему она провалилась:

try:
    row = int(player_choice[0])
    col = int(player_choice[1])
except ValueError:
    print(f"Input must be two numbers, however non-digit characters were received."
except IndexError:
    print("The input should be two numbers separated by a space but no space was entered")

Для проверки лимитов, снова подумайте о предоставлении обратной связи. Также ROWS и т. Д. Не являются такими описательными именами. num_rows лучше. Кроме того, вместо константы, вместо этого сделайте все это функцией и установите вместо них аргументы по умолчанию;

def validate_user_input(player_choice: str, num_rows: int = 10, num_cols: int = 10) -> bool:
    try:
        row, col = player_choice.split()
    except ValueError:
        print("Bad input: The input should be exactly two numbers separated by a space.")
        return False
    try:
        row = int(row)
        col = int(col)
    except ValueError:
        print(f"Input must be two numbers, however non-digit characters were received."
        return False

    if row < 0 or row > num_rows:
        print(f"The first number must be between 0 and {num_rows} but {row} was passed.")
        return False
    if col < 0 or col > num_rows:
        print(f"The second number must be between 0 and {num_cols} but {col} was passed.")
        return False
    return true

И тогда ваш цикл становится:

valid_input = False
while not valid_input:
    player_choice = input("Enter the row and column of your choice separated by a space: ")
    valid_input = validate_user_input(player_choice)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...