В оболочке Python
>>> row, col = "1 2".split()
>>> row, col = "1,2".split(",")
оба работают без ошибок.
Однако в моей функции
def validate_input(inp, grid):
try:
row, col = inp.split()
except:
print("Two items separated by a space please.")
return False
return True
работает нормально, но
def validate_input(inp, grid):
try:
row, col = inp.split(",")
except:
print("Two items separated by a comma please.")
return False
return True
приводит ValueError: not enough values to unpack (expected 2, got 1)
для ввода 1,2
.
РЕДАКТИРОВАТЬ: inp
- произвольная строка, возвращаемая из input()
внутри другой функции.
Что дает пожалуйста?
Всего 2 ответа
В вашей неудачной попытке у вас есть:
def validate_input(inp, grid):
try:
row, col = inp.split(",")
except:
print("Two items separated by a comma please.")
return False
return True
Вы ожидаете получить список с точными 2 элементами. Но поскольку ваши входные данные не выглядят так, как минимум 1 ,
ваш код не работает.
Пример:
row, col = "no_split".split(",")
# ValueError: not enough values to unpack (expected 2, got 1)
row, col ="too,many,split".split(",")
# ValueError: too many values to unpack (expected 2)
row, col ="exact,split".split(",")
# No Error
Может быть, лучше попробовать одну функцию проверки, которая обрабатывает оба случая?
Если это так, попробуйте:
def validate_input(inp, grid):
if ',' in inp:
split_ch = ','
else:
split_ch = None
try:
row, col = inp.split(split_ch)
except:
print("Two items separated by a comma or space please.")
return False
return True
В вашем случае вы получаете сообщение об ошибке, если пользователь не вводит что-либо с запятой. Делить нечего, поэтому возвращаем список только с одним элементом. Вы пытаетесь распаковать этот список из одного элемента в две переменные, поэтому вы получите эту ошибку. Вы также можете сделать разделение и проверить, что разделение возвращает два элемента. Это может быть проще и проще. Итак, в качестве альтернативы ...
def validate_input(inp, grid):
if ',' in inp:
split_ch = ','
else:
split_ch = None
if len(inp.split(split_ch)) != 2:
print("Two items separated by a comma or space please.")
return False
return True
Кроме того, вы можете обрабатывать случайные символы пробела, если пользователь вводит запятую. Если запятая отсутствует, расщепление пробела позаботится о любых случайных пробелах. Но если пользователь вводит «5, 6» вместо «5,6» и вы разделяете запятую, ваше второе значение будет «6» вместо «6». Вы можете очистить это с помощью команды .strip()
которая удалит пробелы с любого конца строки. Дополнительное пространство не вызовет проблем при приведении к int
, но это может быть утомительным в будущем.