Проверка вводимых данных на корректность на Python 3

Задача состоит в следующем: пишу кода на Python 3.10. Необходимо, чтобы пользователь ввёл с клавиатуру пару значений через пробел таким образом, чтобы:

  1. Первое значение - буква "R" или "L"
  2. Второе значение - целое число

Необходимо осуществить проверку на корректность ввода, т.е. на тип данных и их порядок. Возможно ли это сделать без нагромождения условных конструкций? (Например, через try-except с подхватом ValueError)? Сижу уже третий день и никак не могу понять, как сделать) Основная проблема в том, чтобы проверить именно второе значение, т.к. int() выполняет преобразование дробных чисел к целым... Подскажите, дураку, как эту проблему можно решить?


Ответы (3 шт):

Автор решения: Алексей Булавка

У меня такой вариант:

a = input().split()
try:
    print( "YES" if a[0] in ['R', 'L'] and int( a[1] ) else "NO" )
except:
    print( "Exception" )

выведет YES, если Ваше условие верно, и NO в противном случае, а если будет ошибка, выведет Exception Ответ на скорую руку, если будут вопросы обращайтесь.

→ Ссылка
Автор решения: Fedіr Yatsenko

Можно использовать регулярные выражения (Regular expression):

import re


r = re.compile(r'[LR] \d+')

if r.match(s):
    ...


print(r.match('L '))         # None
print(r.match('L 150'))      # Match object
print(r.match('R 5465'))     # Match object
print(r.match('R5465'))      # None
print(r.match('R54 65'))     # None
print(r.match('R'))          # None
print(r.match('RL 455465'))  # None
print(r.match(' 455465'))    # None
print(r.match('A 455465'))   # None

Если ещё нужно достать значения, тогда нужно использовать группы (Группирующие скобки в регулярных выражениях)

→ Ссылка
Автор решения: Stanislav Volodarskiy

Разбить строку на ровно две части, первую проверить на принадлежность кортежу (он нужен только для получения ошибки при неверном символе), вторую преобразовать в целое. Если завершилось без исключения, у вас есть разобранная строка. Иначе надо обрабатывать ошибку:

s = input()
try:
    a, b = s.split()     # заодно проверяем количество слов в строке
    ('L', 'R').index(a)  # проверяем что первое слово 'L' или 'R'
    b = int(b)           # заодно проверяем целое
except ValueError:
    raise

print(a, b)

Недостаточно аргументов в строке:

$ echo L | python temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 3, in <module>
    a, b = s.split()
    ^^^^
ValueError: not enough values to unpack (expected 2, got 1)

Слишком много аргументов в строке:

$ echo L 2 3 | python temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 3, in <module>
    a, b = s.split()
    ^^^^
ValueError: too many values to unpack (expected 2)

Ошибка в первом значении:

$ echo ? 42 | python temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 4, in <module>
    ('L', 'R').index(a)
ValueError: tuple.index(x): x not in tuple

Ошибка во втором значении:

$ echo L word | python temp.py
Traceback (most recent call last):
  File "/home/sv/desk/stackoverflow/temp.py", line 5, in <module>
    b = int(b)
        ^^^^^^
ValueError: invalid literal for int() with base 10: 'word'

Нормальная работа:

$ echo L 42 | python temp.py
L 42
→ Ссылка