asm*_*rer 24 python coding-style mutable mutability
我在这里主要谈论Python,但我想这可能适用于大多数语言.如果我有一个可变对象,那么进行就地操作也是一个坏主意还会返回该对象吗?似乎大多数示例只是修改对象并返回None.例如,list.sort.
And*_*ter 30
是的,这是一个坏主意.原因在于,如果就地和非就地操作具有明显相同的输出,那么程序员将经常混合就地操作和非就地操作(List.sort()相对sorted()),这导致难以检测错误.
返回自身的就地操作可以允许您执行"方法链接",但是,这是不好的做法,因为您可能会意外地在链中间埋没具有副作用的函数.
为了防止这样的错误,方法链应该只有一个带有副作用的方法,并且该函数应该在链的末尾.链中的函数应该在没有副作用的情况下转换输入(例如,导航树,切割字符串等).如果就地操作返回自己,则程序员必然会意外地使用它来代替返回副本的替代函数,因此没有副作用(同样,List.sort()相反sorted()),这可能导致难以调试的错误.
这就是Python标准库函数总是返回副本或返回None和修改对象的原因,但永远不会就地修改对象并返回自己.像Django这样的其他Python库也遵循这种做法(请参阅这个关于Django的类似问题).
Ósc*_*pez 10
从修改它的方法返回修改后的对象可以有一些好处,但不建议在Python中使用.self在修改操作之后返回将允许您对对象执行方法链接,这是在同一对象上执行多个方法的便捷方式,这是面向对象编程中非常常见的习惯用法.反过来,方法链接允许直接实现流畅的接口.此外,它允许更容易地表达一些功能编程习语.
举几个例子:在Python中,Moka库使用方法链.在Java中,StringBuilder该类允许append()对同一对象进行多次调用.在JavaScript中,JQuery广泛使用方法链接.Smalltalk将这个想法提升到了一个新的水平:默认情况下,除非另有说明,否则所有方法都会返回self(因此鼓励方法链接) - 将此与Python进行对比,后者None默认返回.
使用这个习惯用法在Python中并不常见,因为Python遵守命令/查询分离原则,该原则指出"每个方法应该是执行操作的命令,或者是将数据返回给调用者的查询,而不是都".
考虑到所有因素,self最终返回是一个好主意还是坏主意是编程文化和惯例的问题,与个人品味相结合.如上所述,一些编程语言鼓励这一点(如Smalltalk),而其他编程语言则不鼓励它(如Python).每种观点都有利有弊,热烈讨论.如果你是一本书旁边的Python教徒,最好不要回复self- 只要知道有时候破坏这个规则会很有用.
| 归档时间: |
|
| 查看次数: |
2415 次 |
| 最近记录: |