Проверка вводимых данных на корректность на Python 3
Задача состоит в следующем: пишу кода на Python 3.10. Необходимо, чтобы пользователь ввёл с клавиатуру пару значений через пробел таким образом, чтобы:
- Первое значение - буква "R" или "L"
- Второе значение - целое число
Необходимо осуществить проверку на корректность ввода, т.е. на тип данных и их порядок. Возможно ли это сделать без нагромождения условных конструкций? (Например, через 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
Ответ на скорую руку, если будут вопросы обращайтесь.
Можно использовать регулярные выражения (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
Если ещё нужно достать значения, тогда нужно использовать группы (Группирующие скобки в регулярных выражениях)
Разбить строку на ровно две части, первую проверить на принадлежность кортежу (он нужен только для получения ошибки при неверном символе), вторую преобразовать в целое. Если завершилось без исключения, у вас есть разобранная строка. Иначе надо обрабатывать ошибку:
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