Процедура Python возвращает значения [закрыто]
В Python можно создать процедуру, которая не имеет явного возврата. т.е .:
def test(val):
if 0 == val:
return 8
Далее можноназначать результаты этой функции в переменную:
>>> a = test(7)
>>> print `a`
'None'
Какого черта это? Какая языковая логика стоит за этим непонятным дизайнерским решением? Почему это просто не вызывает ошибку компилятора?
РЕДАКТИРОВАТЬ: Да, я понимаю, что это работает таким образом. Благодарю. У меня вопрос ПОЧЕМУ? Кажется, такой надежный способ внести незначительные ошибки в ваш код. И кажется, как было упомянуто ниже e-sat, идти против очень мудрой питонской пословицы, что «явное лучше, чем неявное».
Итак, что с этим? Это просто упущение в дизайне, упрощенное предположение или продуманное взвешенное решение?
РЕДАКТИРОВАТЬ: все согласны с тем, что выражение намерения таким образом гораздо лучше:
def test(val):
if 0 == val:
return 8
else:
return None
Если так, почему Python предпочел бы прежний стиль, а не исключение времени компиляции?
РЕДАКТИРОВАТЬ: С.Лотт ясно поднимает вопрос (и другие тоже делают, его просто кажется мне наиболее ясным), что это поведение является результатом того факта, что Python является динамическим языком и поэтому не может проверить во время компиляции, поведение системы во время выполнения.
Поскольку нет различий между процедурами (те функции, которые не возвращают значений) и функциями (те, которые делают), то нет ничего, чтобы обеспечить во время компиляции. Это означает, что когда мы переходим к поведению во время выполнения, в некоторых случаях у нас либо катастрофический сбой (мы выкидываем исключение), либо мы молча терпим неудачу, предполагая, что программист знал, что они делают, и понимал поведение по умолчанию.
Pythonic способ сделать последнее, C-стиль способ сделать первое.
Кажется, это имеет смысл как хорошая причина сделать это таким образом.
Явное обоснование С.Лотта скрыто в комментариях к принятому ответу, поэтому я решил, что лучше подвести итог здесь.
Я немного задержусь, чтобы принять ответ, чтобы посмотреть, даст ли С.Лотт официальный ответ. В противном случае, я дам очки SilentGhost.