Процедура 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.

Ответы на вопрос(6)

Ваш ответ на вопрос