Как проверить, какой оператор возврата был выполнен в функции? - PullRequest
0 голосов
/ 16 мая 2018

Привет, у меня есть простая функция:

def check_val(value):
    if value < 10:
        previous = value
        return previous
    else:
        current  = value + 10
        return current

a = check_val(3)

Как я могу узнать, было ли возвращено current или previous?

Ответы [ 3 ]

0 голосов
/ 16 мая 2018

Вы не можете, если вы не вернете кортеж с флагом, указывающим, куда вы вышли

def check_val(val):
    if value < 10:
        previous = value
        return previous, False
    else:
        current  = value + 10
        return current, True

a, was_current = check_val(3)

print(a, was_current)  # --> 3 False
0 голосов
/ 16 мая 2018

Ну, во-первых, вы не можете сделать это напрямую.Невозможно определить, какое возвращение отправило вам значение только из самого значения.

Конечно, вы можете вернуть кортеж, как указано в других ответах.

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

Вот так, может быть:

def check_condition(value):
    if value < 10:
        return True
    return False

def get_result(value, condition):
    if condition:
        return value
    else:        
        return value + 10

val = 5
check_result = check_condition(val)
result = get_result(val, check_result)

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

0 голосов
/ 16 мая 2018

Вы можете сделать так, чтобы ваша функция возвращала tuple с необходимой мета и распаковывала через последовательность распаковки:

def check_val(value):
    if value < 10:
        previous = value
        return previous, 'previous'
    else:
        current  = value + 10
        return current, 'current'

a, b = check_val(3)

print(a, b)

3 previous
...