Причина, по которой методы мутирования в Python НЕ возвращают ссылку на объект, который они мутировали, можно найти в принципе Разделение команд-запросов (CQS для краткости). Python не применяет CQS так тщательно, как это делает язык Мейера Эйфеля (поскольку - согласно Zen of Python, иначе говоря, import this
, «практичность превосходит чистоту»): например, somelist.pop()
возвращает только что выскочивший элемент (все еще НЕ контейнер, который только что мутировал ;-), в то время как при выталкивании в Eiffel стек не имеет возвращаемого значения (в общем случае, когда вам нужно выскочить и использовать верхний элемент, вы сначала используете «запрос», чтобы посмотреть сверху и позже "команда", чтобы заставить вершину уйти).
Глубокая мотивация CQS на самом деле не в том, что «мутаторы не должны возвращать ничего полезного», скорее, это «запросы не должны иметь побочных эффектов». Предполагается, что сохранение различий (будь то строго или «как правило, а не правило») поможет вам помнить об этом, и это работает в некоторой степени (обнаружение некоторых случайных ошибок), хотя иногда это может вызывать неудобства, если Вы привыкли к плавным языкам "выражения и выражения - это одно и то же".
Другим аспектом CQS (в широком смысле ...) в Python является различие между утверждениями и выражениями. Опять же, это не применяется жестко - выражение может использоваться везде, где это возможно, что иногда скрывает ошибки, например, когда кто-то забывает, что для вызова функции ему нужно foo()
, а НЕ просто foo
;-). Но, например (и радикально отличающийся от C, Perl и т. Д.), Вы не можете легко назначить что-либо во время одного и того же тестирования (if(a=foo())...
), что иногда неудобно, но действительно обнаруживает другие виды случайных ошибок.