我在这里主要谈论Python,但我想这可能适用于大多数语言。如果我有一个可变的对象,那么就地操作也返回该对象是一个坏主意吗?似乎大多数示例只是修改对象并返回None。例如,list.sort。
None
list.sort
是的,这是一个坏主意。原因是,如果就地操作和非就地操作具有明显相同的输出,那么程序员将经常混淆就地操作和非就地操作(List.sort()vs. sorted()),从而导致难以检测错误。
List.sort()
sorted()
返回自身的就地操作可以允许您执行“方法链接”,但是,这是不好的做法,因为您可能会将带有副作用的函数偶然地埋在链的中间。
为防止此类错误,方法链应只具有一种具有副作用的方法,并且该功能应位于链的末尾。链中位于此之前的函数应该转换输入而没有副作用(例如,导航树,切片字符串等)。如果就地操作返回了自己,那么程序员必然会意外地使用它来代替替代函数,该替代函数返回一个副本,因此没有副作用(再次是List.sort()vs sorted()),这可能会导致难以调试的错误。
这就是Python标准库函数总是返回副本或None就地返回并修改对象,而从不就地修改对象并返回自身的原因。其他Python库(例如Django)也遵循这种做法(请参见有关Django的非常相似的问题)。