小编典典

使就地操作返回对象不是一个好主意吗?

python

我在这里主要谈论Python,但我想这可能适用于大多数语言。如果我有一个可变的对象,那么就地操作也返回该对象是一个坏主意吗?似乎大多数示例只是修改对象并返回None。例如,list.sort


阅读 152

收藏
2021-01-16

共1个答案

小编典典

是的,这是一个坏主意。原因是,如果就地操作和非就地操作具有明显相同的输出,那么程序员将经常混淆就地操作和非就地操作(List.sort()vs.
sorted()),从而导致难以检测错误。

返回自身的就地操作可以允许您执行“方法链接”,但是,这是不好的做法,因为您可能会将带有副作用的函数偶然地埋在链的中间。

为防止此类错误,方法链应只具有一种具有副作用的方法,并且该功能应位于链的末尾。链中位于此之前的函数应该转换输入而没有副作用(例如,导航树,切片字符串等)。如果就地操作返回了自己,那么程序员必然会意外地使用它来代替替代函数,该替代函数返回一个副本,因此没有副作用(再次是List.sort()vs
sorted()),这可能会导致难以调试的错误。

这就是Python标准库函数总是返回副本或None就地返回并修改对象,而从不就地修改对象并返回自身的原因。其他Python库(例如Django)也遵循这种做法(请参见有关Django的非常相似的问题)。

2021-01-16