就地操作返回对象是一个坏主意吗?

2024-05-23

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


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

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

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

这就是 Python 标准库函数总是返回副本或返回的原因None并就地修改对象,但绝不就地修改对象并返回自身。其他 Python 库(例如 Django)也遵循这种做法(请参阅这个非常相似的问题 https://stackoverflow.com/questions/10936737/why-does-django-orms-save-method-not-return-the-saved-object/10936874关于姜戈)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

就地操作返回对象是一个坏主意吗? 的相关文章

随机推荐

  • 将 Eclipse 中的路径/文件名复制到剪贴板

    是否有将当前路径 文件复制到剪贴板的快捷方式 Just select the file tab and hit Ctrl C to copy file basename into clipboard Hit Alt Enter to bri
  • 将 .com 重定向到 .htaccess 中的 .org

    我将domain com 和domain org 作为指向同一虚拟主机的别名 如何使用 htaccess 将所有domain com 请求重定向到domain org 你可以使用模组重写 http httpd apache org docs
  • 随机打乱 C++ 数组(每次都不同)

    我想在C 中对数组进行洗牌 并且每次运行程序时 我想要进行不同的随机洗牌 我有myArray的长度 目前我正在使用 random shuffle myArray myArray N 但这每次都会产生相同的洗牌 为了包含随机数 我尝试过 ra
  • Mono 实现 CLR 吗?或者至少有一些非托管的内部调用?或无?

    我们知道 C 使用非托管代码 如 P Invoke 或 CLR 实现的代码 如 InternalCall 我想知道的是 mono 它自己实现了一个完整的 CLR 还是只是一些非托管代码或者什么都没有 我可以使用 Net Reflactor或
  • 在 (Mac)Vim 中查看 ri 时摆脱 ANSI 转义字符

    我在 gvim 和 MacVim 中查看 ri 文档时遇到问题 在两者上都尝试过 一些 ri 文档包含在终端窗口中查看时看起来不错的文本装饰 但在 gvim MacVim 中查看时包含 ANSI 转义字符 例如 以下 ri 片段来自 ri
  • ImageMagick - 在不知道图像尺寸的情况下计算透视

    如何获得图像的最大宽度和高度 对其进行一些数学计算 然后将其用于透视变形 我有一堆图像想要应用透视扭曲 唯一的问题是 每个图像的大小不同 此代码适用于我知道尺寸 1440 900 的图像 convert test jpg matte vir
  • Realm.io Android 从表中获取最后 20 项的最佳方法

    在一个包含 100 个项目的表中 这是获取最后 20 个对象的最佳方法 我能想到的一种方法是加载所有对象 反转数组 创建一个新数组 然后从结果中循环 20 次填充新数组并返回它 类似如下 public ArrayList
  • 为什么当输入很大时,asp.net 找不到合适的 apicontroller?

    我有一个功能可以立即保存我的实体列表 public void Save IEnumerable
  • 将字段附加到大小为 ONE 的结构化数组时出现类型错误

    当我尝试将字段附加到大小为 ONE 的结构化数组时 出现运行时错误 我在下面写了一个简单的例子 import numpy as np import numpy lib recfunctions as rcfuncs dtype np dty
  • 为什么我可以在 /proc/pid/maps 输出中看到几个相同的段?

    测试在32位Linux上进行 代码如下 int foo int a int b int c a b return c int main int e 0 int d foo 1 2 printf d n d scanf d e return
  • Ansible 列表未排序

    我有一个正在循环的列表 问题是它给出了一个奇怪的顺序 param yml 文件 my list a val1 b val2 c val3 d val3 这是我的简单调试循环 name debug debug msg item loop my
  • Nokogiri 相当于 jQuery Closest() 方法,用于在树中查找第一个匹配的祖先

    jQuery 有一个可爱的方法 虽然命名有些错误 称为最接近 http api jquery com closest 它会沿着 DOM 树向上寻找匹配的元素 例如 如果我有这样的 HTML table src foo tr td Yay t
  • Rails 中的漂亮路径

    我有一个类别模型 我使用默认的脚手架来路由它resources categories 我想知道是否有办法改变路径 category id to category name 我补充道 match categories name gt cate
  • 2D形状识别与解析算法

    我正在寻找一种算法 用于从给定的一组 x y 点检测简单形状 如矩形 三角形 正方形和圆形 我还在寻找一种方法 一旦检测到 将路径转换为更干净的形状 我已经查遍了互联网 但没有找到任何 简单 的方法 几乎所有这些对于我的简单实现来说都是高级
  • ASP.NET 登录页面

    我想在我的网站上为注册用户添加登录信息 我该如何进行呢 是通过使用session吗 一旦注销发生 Session 变量会发生什么 您的问题非常广泛 有许多不同的方法可以实现 ASP NET 网站的 会员 系统 我建议您首先阅读 会员简介 h
  • 如何在 Shiny 应用程序中访问/打印/跟踪当前选项卡选择?

    我正在一个闪亮的应用程序中工作 我希望能够访问用户在会话中当前所在选项卡上的信息 我有一个观察事件 用于侦听要单击的特定按钮 简而言之 我想存储 打印用户单击此按钮时所在的当前选项卡 单击此按钮后 选项卡将更改为带有 updateTabIt
  • 什么是 TTY?如何在 Ubuntu 上启用它?

    我目前正在设置一个 Node js 服务器 并且在这里使用调试模块https github com visionmedia debug https github com visionmedia debug 我正在尝试启用它 以便我可以在输出
  • 如何使用 RSA-SHA1 算法对 xml 元素进行签名?

    我需要使用 RSA SHA1 算法签署 并最终验证 XML 文档的节点之一 w3 org 链接 https www w3 org TR xmlsec algorithms RSA SHA1 网址 http www w3 org 2000 0
  • 如何获取表中的总行数 |柏

    我有一个有 N 行的表 如何获取表中存在的总行数 我搜索一个名称 该特定名称位于第 X 行中 如何获取该特定行的值 您可以使用 find解决你的两个案件 要获取表行数 cy get tableID find tr then row gt r
  • 就地操作返回对象是一个坏主意吗?

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