Подтвердить что ты не робот

Почему метод django ORM `save` не возвращает сохраненный объект?

Любое понимание причин, лежащих в основе этого проектного решения? Мне кажется, что obj.save() возвращает что-то, имеет только преимущества (например, цепочку методов) и отсутствие недостатков.

4b9b3361

Ответ 1

Как правило, считается, что хорошая практика в Python состоит в том, чтобы иметь функции, которые в первую очередь влияют на существующие объекты, не возвращаются сами. Например, sorted(yourlist) возвращает отсортированный список, но yourlist.sort() сортирует список на месте и ничего не возвращает.

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

Другими словами, в цепочке методов начало цепочки - это вход, середина цепочки преобразует вход (перемещаясь по дереву, сортируя вход, изменяя случай строки и т.д.), и конец цепочки - это функциональная часть, которая работает с побочными эффектами. Если вы похороните методы с побочными эффектами в середине цепи, тогда будет непонятно, что на самом деле делает ваша цепочка методов.

Ответ 2

Это напоминает мне об общем принципе, что недавно Грег Уорд поддерживал в Pycon2015, чтобы не путать функции с процедурами. Каждая функция должна возвращать значение или иметь побочный эффект, но не оба.

В принципе, тот же вопрос задается dict.update().