Есть ли в Python чистый способ вернуть значение функции, если оно не None? - PullRequest
0 голосов
/ 03 апреля 2011

Я пишу много кода, похожего на следующее:

ans = call_function()
if ans:
    return ans

...

Есть ли чистый способ сделать этот лайнер 1 или 2? «Примером» такой парадигмы может быть

if x as call_function():
    return x

Ответы [ 4 ]

1 голос
/ 03 апреля 2011

Кажется, что пока ans не является None, вы можете просто вернуть его, исходя из вашего предполагаемого использования.

if ans is not None:
    return ans
1 голос
/ 03 апреля 2011

Я не уверен, что вы делаете после вашего if, но, возможно, вы делаете следующее:

ans = call_function()
if ans:
    return ans
else:
    return default

В этом случае вы можете просто сделать:

return call_function() or default
0 голосов
/ 04 апреля 2011

Желание встроить назначения в операторы if, вероятно, является одним из наиболее распространенных запросов функций, которые мы видим для Python.Проблема заключается в том, что такие встроенные предложения о назначении обычно работают только в очень ограниченных случаях, когда значение, которое вы хотите сохранить и , условие, которое вы хотите проверить, совпадают (например, ваш пример попадает в эту ловушку и будет бесполезнымесли вам вместо этого нужно проверить более конкретное условие, например if ans is not None:).

Если дополнительная строка действительно вас оскорбляет, вы можете свернуть оператор if в одну строку (if ans: return ans).Однако многие люди ненавидят этот стиль.

Однако я подвергаю сомнению вашу основную посылку: «Я хочу знать, возвращает ли эта функция что-то значимое, и если это так, то это результат этой функции какну, в противном случае я отступлю и вычислю свой результат каким-то другим способом. «Недостаточно оправдания для использования правильно распределенной локальной переменной.

Знание того, что другая функция завершила работу для вас, звучит чертовски важнодля меня.

0 голосов
/ 03 апреля 2011

Возможно, имеет смысл изменить код, который будет следовать за вашим оператором if, в другую функцию.Существует (не неразумная) школа мысли, которая подчеркивает, что каждая функция должна выполнять одну очень специфическую вещь.

В этом случае вы можете написать что-то вроде этого:

ans = call_function()
return ans if ans is not None else following_code()

или, есливы действительно проверяете истинное значение (а не специально проверяете not None):

return call_function() or following_code()

В случае not None вы все равно можете избежать присвоения временной переменной ans, написавфункционируйте так:

def fallback(test_value, routine, *args, **kwargs):
    return test_value if test_value is not None else routine(*args, **kwargs)

и затем используйте его так:

return fallback(call_function(), following_code,
                arg_to_following_code, following_code_kwarg=keywordarg_value)

Это может быть полезно, если вы делаете такие вещи очень часто, но в целом это будетпросто сделайте ваш код немного труднее для чтения, потому что люди не будут знакомы с вашей fallback функцией.Оригинальная форма, используемая в вашем вопросе, громоздка, но она имеет легко узнаваемую форму, которую люди привыкли видеть.Он также делает все очень взвешенно, по одному логическому действию на строку, что является нормой в Python.

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

...