2010-11-18 51 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