45

对这个设计决策背后的原因有任何见解吗?在我看来,obj.save()返回某些东西只有好处(如方法链接)而没有缺点。

4

3 回答 3

70

在 Python 中,主要影响现有对象的函数返回自身通常被认为是一种很好的做法。例如,sorted(yourlist)返回一个排序列表,但yourlist.sort()对列表进行就地排序并且不返回任何内容。

在一行上执行具有副作用的多个操作(与关注返回值的无副作用函数相反)并不是一个很好的做法。代码在行数方面会更紧凑,但会更难阅读,因为重要的副作用可能隐藏在链的中间。如果要使用方法链接,请在链的开头使用没有副作用的函数,然后.save()在末尾使用具有副作用的单个函数。

换句话说,在方法链中,链的开头是输入,链的中间转换输入(向下导航树,对输入进行排序,更改字符串的大小写等),最后是链是具有副作用的功能部分。如果您将具有副作用的方法埋在链的中间,那么您的方法链实际上做了什么就不清楚了。

于 2012-06-07T17:33:35.143 回答
7

这让我想起了 Greg Ward 最近在Pycon2015上提出的一般原则,即不要将函数与过程混淆。每个函数都应该返回一个值或有副作用,但不能两者兼而有之。

对 dict.update()基本上提出了同样的问题

于 2015-05-06T13:49:28.317 回答
1

由于这是我在搜索“django return saved object”时得到的第一个结果,为了恭维安德鲁的回答,如果你仍然想返回保存的对象,而不是使用:

ExampleModel(title=title).save()

返回无,您将使用:

saved_instance = ExampleModel.objects.create(title=title)

这是有效的,因为ExampleModel.objects它是模型管理器而不是类的实例,所以它不会返回自身。

于 2019-11-23T23:12:59.013 回答