对此设计决策背后的推理有何见解?在我看来,让obj.save()
返回某些东西,只有好处(比如方法链),没有任何缺点。
答案 0 :(得分:55)
通常认为在Python中使用主要影响现有对象而不是返回自身的函数是一种很好的做法。例如,sorted(yourlist)
返回已排序的列表,但yourlist.sort()
就地排序列表并且不返回任何内容。
在单行上执行带副作用的多个操作(与焦点在返回值上的无副作用函数相反)并不是一个好习惯。在行数方面,代码将更加紧凑,但由于重要的副作用可能隐藏在链的中间,因此难以阅读。如果你想使用方法链接,在链的开头使用没有副作用的函数,然后在最后有一个副作用,如.save()
。
换句话说,在方法链中,链的开头是输入,链的中间转换输入(在树中导航,对输入进行排序,更改字符串的大小写等)和链的末端是与副作用一起起作用的功能部分。如果你在链中间埋葬带有副作用的方法,那么你的方法链实际上会做什么就不清楚了。
答案 1 :(得分:3)
这让我想起Greg Ward espoused最近在Pycon2015上的一般原则,而不是将功能与程序混淆。每个函数都应返回一个值或有副作用,但不能同时返回两个。
基本上与dict.update()的问题is asked相同。
答案 2 :(得分:0)
由于这是我在搜索“ django返回保存的对象”时得到的第一个结果,因此如果您仍想返回保存的对象,而不是使用:
ExampleModel(title=title).save()
返回无,您将使用:
saved_instance = ExampleModel.objects.create(title=title)
这是可行的,因为ExampleModel.objects
是Model Manager而不是类的实例,因此它不会返回自身。