【问题标题】:Python: catching mutable default argumentsPython:捕获可变的默认参数
【发布时间】:2010-11-18 03:02:59
【问题描述】:

我知道the problem 以及如何解决它。我想寻求帮助,在现有代码中找到这个问题。

换句话说,我正在尝试找到所有埋藏此陷阱的位置,以便修复它。

有什么工具可以帮到我吗?

【问题讨论】:

  • 没有任何经验的人会使用列表或字典作为默认参数。你做一次。八小时和很多眼泪之后,你才弄明白,以后再也不会这样做了;)
  • “我正在寻找所有埋有这个陷阱的位置”?谁埋的?找到犯此错误的程序员并向他们解释问题。为什么他们不能学习和修复他们的代码?
  • @S.Lott:同意并编辑标题。这是我在了解这个问题之前的代码。
  • @nate c:我同意,但这引发了一个问题,即为什么语言允许可变对象作为默认参数。
  • 它们完全合法且有意义。只是一开始的意思有点意外。然而,人们使用可变的默认对象来构建函数来记忆他们的结果。它是语言中标准的、众所周知的、有意的部分。它有一个用例。

标签: python debugging ide


【解决方案1】:

Pylint 对可变类型的默认参数值发出警告。它是可定制的,所以如果你愿意,你可以让它去做。

【讨论】:

  • 不幸的是,我似乎无法找到 Pylint 在 Windows 下与 ActiveState Python 3.1 一起使用。有人知道它是否可用吗?
【解决方案2】:

grep 有什么问题?

grep "^\s*def.*=(\[\]|\{\}|set\(\))"

这将找到几乎所有常见的罪魁祸首。

如果您使用自己的可变类之一的实例作为默认值,则必须单独检查。

【讨论】:

  • 如果函数定义被分割成多行怎么办?以我有限的经验,我从来没有得到一个正则表达式来正确搜索代码。
  • @max: 有多少个函数定义跨越多行?你的代码库有多大?这是一次性的练习。如果它需要使用 grep 来查找在一行上不完整的函数定义,那没关系。你再也不会做这份工作了。
  • @max 我知道这是旧的,但是要找到(罕见的)多行变体,这应该可以工作.. pcregrep 应该随大多数版本的 linux 一起提供,尽管不在 OSX 上,我不知道不知道 Windows 的可用性:find . -name "*py" | xargs pcregrep -M 'def .+?\([^)]+[\[{[]'
【解决方案3】:

@S.Lott 提出的正则表达式也是查找函数/方法calls,但我们只想查找函数/方法definitions

所以这是一个更新版本的正则表达式,用于查找所有使用可变默认参数的函数/方法签名的位置:

def .+?\([^:]*?(=\[\]|=\{\}|set\(\))[^:]*?\):

注意:

如果您使用的是 PyCharm,它将为这些参数添加黄色背景并帮助您更改代码。

享受吧!

【讨论】:

    猜你喜欢
    • 2016-03-12
    • 2014-05-31
    • 2018-04-27
    • 2021-10-11
    • 2021-08-18
    • 1970-01-01
    • 2011-05-07
    • 2019-07-30
    • 2015-03-31
    相关资源
    最近更新 更多