2016-09-26 3 views
2

Извините, если этот вопрос уже ответил, я не мог придумать лучшего способа описать эту проблему:/Функция с несколькими вариантами возвращения

Допустим, у меня есть функция, как это:

def func(arg): 
    if arg something: 
     return a, b, c, d 
    else: 
     return False 

Так что, когда я называю эту функцию следующим образом:

a, b, c, d = func(arg) 

, и это происходит, что функция возвращает только ложное -would это создать проблему (так как я начисление 4 переменных, но только получение 1 BOOL) ?

ответ

2

Да, он поднимет ValueError. Вы можете позаботиться о том, обернув назначение с try-except заявление:

try: 
    a, b, c, d = func(arg) 
except ValueError: 
    # pass or do something else 

Заметим, что вы можете также проверить проверки вашего возвращаемого значения, но так как это Easier to ask for forgiveness than permission как стиль кодирования таким образом, что лучше использовать try-except для этого.

2

Вы можете просто проверить возвращаемое значение, а затем распаковывать:

value = func(arg) 
if value: 
    a, b, c, d = value 

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

1

Функции с гетерогенными типами возврата неудобны для вызывающего.

Можете ли вы реорганизовать? Если случай else является режимом сбоя, рассмотрите возможность использования исключений для этого случая - python не является golang.

2

Да, это может вызвать проблемы. Как правило, вы не хотите делать что-то подобное, это часто приводит к неожиданным ошибкам, которые впоследствии трудно поймать. Python позволяет вам нарушать правила, возвращая все, что вы хотите, но вы должны делать это только в том случае, если у вас есть веская причина. Как правило, ваши функции и методы должны возвращать один и тот же тип независимо от того, что (за исключением, возможно, None).

1

Как насчет вместо смешанных типов возврата, просто рефакторинг требует, чтобы функция имела правдивый аргумент и вызывала ошибку? Таким образом, ошибка будет возникать внутри функции, а не при назначении, что кажется мне более ясным.

def func(arg): 
    if not arg: 
     raise ValueError('func requires a truthy argument') 
    return a, b, c, d 
Смежные вопросы