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