Установите две переменные из функции, которые возвращают две переменные или возвращают None - PullRequest
0 голосов
/ 06 января 2020

1 функция:

def first_func():
    x = input('Tell me')
    if x == 'q':
        y, z = 5, 5
        return y, z
    if x == 'w':
        y, z = 6, 6
        return y, z
    else:
        print('Nothing for you')
        run_other_function()
        return None

Я хочу, чтобы пользователь мог отвечать как на q, w, так и на любую букву, которую хочет пользователь, и затем я хочу использовать эту функцию с двумя переменными:

r, t = first_func()

Но если x не является q или w, я получаю:

TypeError: Cannot unpack non-iterable NoneType object

Что я полностью понимаю, почему я получаю, но есть ли способ использовать его таким образом, или я не может использовать это вообще так? Может ли моя функция вернуть что-либо в else, чтобы r и t не получили объект NoneType?

Я хочу использовать r и t в качестве входных данных для другой функции:

coordinates(r,t)

Но если пользователь введет что-то еще, кроме r и t, оно сломается даже до того, как я туда доберусь.

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

TIA!

Ответы [ 2 ]

0 голосов
/ 06 января 2020

Вы ожидаете двух результатов, но возвращаете только один. Попробуйте следующее небольшое изменение.

def first_func():
    x = input('Tell me')
    if x == 'q':
        y, z = 5, 5
        return y, z
    if x == 'w':
        y, z = 6, 6
        return y, z
    else:
        print('Nothing for you')
        run_other_function()
        return None, None
0 голосов
/ 06 января 2020

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

def first_func():
    x = input('Tell me')
    if x == 'q':
        y, z = 5, 5
        return y, z
    if x == 'w':
        y, z = 5, 5
        return y, z
    else:
        print('Nothing for you')
        run_other_function()
        raise ValueError

try:
    r, t = first_function()
except ValueError:
    print('we know for sure something bad happened')
else:
    print('nothing bad happened, we know for sure both r and t are defined and not None')
    print(r, t)


Если вам не нравится этот подход, вы можете return None, None вместо return None. Таким образом, r и t оба будут None, но тогда любой вызывающий код должен будет проверить, являются ли r и / или t целыми числами или None.

...