对这个设计决策背后的原因有任何见解吗?在我看来,obj.save()
返回某些东西只有好处(如方法链接)而没有缺点。
3 回答
在 Python 中,主要影响现有对象的函数不返回自身通常被认为是一种很好的做法。例如,sorted(yourlist)
返回一个排序列表,但yourlist.sort()
对列表进行就地排序并且不返回任何内容。
在一行上执行具有副作用的多个操作(与关注返回值的无副作用函数相反)并不是一个很好的做法。代码在行数方面会更紧凑,但会更难阅读,因为重要的副作用可能隐藏在链的中间。如果要使用方法链接,请在链的开头使用没有副作用的函数,然后.save()
在末尾使用具有副作用的单个函数。
换句话说,在方法链中,链的开头是输入,链的中间转换输入(向下导航树,对输入进行排序,更改字符串的大小写等),最后是链是具有副作用的功能部分。如果您将具有副作用的方法埋在链的中间,那么您的方法链实际上做了什么就不清楚了。
这让我想起了 Greg Ward 最近在Pycon2015上提出的一般原则,即不要将函数与过程混淆。每个函数都应该返回一个值或有副作用,但不能两者兼而有之。
对 dict.update()基本上提出了同样的问题。
由于这是我在搜索“django return saved object”时得到的第一个结果,为了恭维安德鲁的回答,如果你仍然想返回保存的对象,而不是使用:
ExampleModel(title=title).save()
返回无,您将使用:
saved_instance = ExampleModel.objects.create(title=title)
这是有效的,因为ExampleModel.objects
它是模型管理器而不是类的实例,所以它不会返回自身。