【问题标题】:In Python, is use of `del` statement a code smell?在 Python 中,使用 `del` 语句是代码异味吗?
【发布时间】:2011-05-30 12:41:03
【问题描述】:

我倾向于在编写原型脚本时使用它,并且:

  1. 使用一些通用的变量(例如fileCount),并且
  2. 有一个大型方法(20 多行),并且
  3. 暂时不要使用类或命名空间。

在这种情况下,为了避免潜在的变量冲突,我一完成就删除了这个 bugger。我知道,在生产代码中我应该避免使用 1.、2. 和 3.,但是从可以工作的原型到完全完善的类是很耗时的。有时我可能想满足于一个次优的、快速的重构工作。在这种情况下,我发现可以方便地使用 del 语句。我是否正在养成一种不必要的坏习惯? del 完全可以避免吗?什么时候会是好事?

【问题讨论】:

  • 我同意它很有用。我知道我被循环变量泄漏咬了,然后在不应该的时候被设置。
  • “del 完全可以避免吗?” -> 你只需要del mydict[key]
  • @nate c,(至少我)关心的不是性能,而是重用从 for 循环和/或前一个块溢出的变量(由于拼写错误/糟糕的代码组织)代码中有错误的值。复制粘贴类型的代码特别容易出错;)
  • 它通过在已经为您完成的事情中添加不必要的逻辑来破坏目的。名称冲突在任何语言中都是一个错误(无论有没有内存管理),可以通过其他方式解决。

标签: python del


【解决方案1】:

我不认为del 本身就是一种代码味道。

在同一个命名空间中重用变量名绝对是一种代码异味,因为在适当的情况下不使用类和其他命名空间。所以使用del 来促进这种事情是一种代码味道。

我能想到的唯一真正合适的 del 用法是打破循环引用,这通常也是一种代码异味(通常,这甚至没有必要)。请记住,del 所做的只是删除对象的引用,而不是对象本身。这将通过引用计数或垃圾收集来处理。

>>> a = [1, 2]
>>> b = a
>>> del a
>>> a
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> b
[1, 2]

您可以看到该列表在 del 语句之后保持活动状态,因为 b 仍然持有对它的引用。

因此,虽然del 并不是真正的代码异味,但它可以与确实存在的事物相关联。

【讨论】:

  • del 所做的是删除对对象的引用 这并不完全正确,del 所做的是将引用计数器减 1,然后从命名空间中移除绑定变量名。
  • 删除对对象的引用意味着将其从命名空间中删除并递减引用计数器。那就是如果 Python 实现使用引用计数。如果没有,del 会执行前者但不会执行后者。
  • 好的,是的,也许我没听懂:),别介意我+1;
【解决方案2】:

任何在函数、类和方法中组织良好的代码都不需要del,除非在特殊情况下。旨在通过使用更多函数和方法,避免重用变量名等,从一开始就构建您的应用程序。

del 语句的使用是可以的——它不会导致任何问题,当我使用 Python 作为我系统上的 shell 脚本的替代品时,以及在进行脚本实验时,我经常使用它。但是,如果它经常出现在真实的应用程序或库中,则表明某些事情不太好,可能是代码结构不佳。我从来不用在应用程序中使用它,而且你很少会看到它在已发布代码的任何地方使用。

【讨论】:

  • 我什至不在脚本中使用它...我的脚本没有那么长;)
  • @delnan,如果您包含合理的错误检查,脚本会很快变长。如果这些脚本仅适用于您的 [调试] 眼睛 - 很好。如果您的脚本依赖于其他脚本的输出或构建过程,我认为明智的做法是预测该输出格式的更改并在您发现它时立即提供有用的错误消息。
  • @Hamish:是的,但更多的是ifprint 语句,而不是更多变量。
  • 它对于从字典中删除内容仍然很有用。
猜你喜欢
  • 2013-02-04
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2011-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多