2010-11-18 52 views
2

我知道the problem以及如何解决它。我想请求帮助在现有的代码中找到这个问题。Python:捕捉可变默认参数

换句话说,我试图找到这个陷阱被埋没的所有位置,所以我可以修复它。

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

+3

任何有经验的人都不会使用列表或字典作为默认参数。你做一次。八个小时,很多眼泪后来你想出来,永远不会再做;) – 2010-11-18 03:08:24

+0

“我试图找到所有这个陷阱被埋没的地点”?谁埋了它?找到犯了这个错误的程序员并向他们解释问题。他们为什么不能学习和修复他们的代码? – 2010-11-18 12:25:31

+0

@ S.Lott:同意并编辑标题。在我了解这个问题之前,它是我自己的代码。 – max 2010-11-18 19:37:46

回答

3

grep有什么问题?

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

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

如果您将自己的某个可变类的实例用作默认值,则必须单独检查。

+0

如果函数定义被分成多行,该怎么办?在我有限的经验中,我从来没有得到正则表达式来正确搜索内部代码。 – max 2010-11-18 19:44:02

+0

@max:多少个函数定义跨越多行?你的代码库有多大?这是一次性的练习。如果它需要使用grep来查找在一行上不完整的函数定义,那没关系。你永远不会再做这个工作。 – 2010-11-18 20:41:40

+1

@max我知道这是旧的,但要找到(罕见的)多线变种,这应该工作.. pcregrep应与大多数口味的Linux,虽然不在OSX上,我不知道Windows的可用性: '找。 -name“* py”| xargs pcregrep -M'def。+?\([^)] + [\ [{[]'' – slinkp 2013-10-09 19:25:44

10

Pylint对可变类型的默认参数值有警告。它是可定制的,所以你可以得到它只是如果你想要做到这一点。

+0

不幸的是,我似乎无法找到Pylint在Windows下使用ActiveState Python 3.1。任何人都知道它是否可用? – max 2010-11-18 19:40:18