Python Split () работает не так, как ожидалось

В оболочке 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 , но это может быть утомительным в будущем.


Есть идеи?

10000