2010-08-26 28 views
13

我有一堆Python模塊我想要清理,重新組織和重構(有一些重複的代碼,一些未使用的代碼......),並且我想知道是否有工具製作哪個模塊使用哪個其他模塊的映射。用Python導入映射模塊以便重構

理想情況下,我想一個地圖是這樣的:

main.py 
-> task_runner.py 
    -> task_utils.py 
    -> deserialization.py 
    -> file_utils.py 
-> server.py 
    -> (deserialization.py) 
    -> db_access.py 

checkup_script.py 
re_test.py 
main_bkp0.py 
unit_tests.py 

......這樣我就可以告訴我就可以開始走動第一(file_utils.py,db_access.py),裏面的文件哪些文件(我實際上使用了大約60個模塊)

寫一個這樣做的腳本可能不會是非常複雜(雖然有不同的語法來處理導入),但我也希望我不是第一個想要這樣做的人(如果有人爲此做了一個工具,它可能包含其他整潔的功能,例如告訴我哪些類和功能可能未被使用)。

你是否知道有助於代碼重組的任何工具(即使是簡單的腳本)?

你知道我想要做的更準確的術語嗎?代碼重組?

回答

14

Python的modulefinder這樣做。編寫腳本可以很容易地將這些信息轉化爲導入圖(您可以使用例如graphviz進行渲染):這是clear explanation。還有snakefood可以爲您完成所有工作(也可以使用AST)

您可能想要查看pylintpychecker以瞭解更多常規維護任務。

+1

我不知道蛇食,非常感謝鏈接。 +1 – 2010-08-26 10:42:06

+1

謝謝!我設法通過無恥地竊取您發送的解釋中的代碼並戳到它,直到它爲我提供我需要的圖表,才準確地獲得了我正在尋找的地圖。我還使用模塊查找器列出了我沒有使用的模塊(超過一半),所以我可以nuke'em而不再考慮它們。 我也得到了pylint,但還沒有玩得太多。 – Emile 2010-08-28 18:40:39

4

編寫一個腳本,做這可能不會是很複雜的(雖然有不同的語法導入處理),

這是微不足道的。有importfrom module import。兩種語法來處理。

你知道我想要做的更準確的術語嗎?代碼重組?

設計。它被稱爲設計。是的,你重構現有的設計,但是......

規則一

切勿啓動你有什麼設計工作。如果你這樣做,你只會「邊緣化」,做出小而有時不重要的變化。

規則二

開始與你應該有什麼,如果你只去過聰明的設計工作。廣泛而清晰地考慮你真的應該在做什麼。忽略你做了什麼。

法則三

從地面設計(或從頭如有些人說的)用正確的包和模塊架構。

爲此創建一個單獨的項目。

規則四

測試先行。爲您的新架構編寫單元測試。如果您有現有的單元測試,請將它們複製到新項目中。修改導入以反映新架構,並重寫測試以表達您光榮的新簡化。

所有測試都失敗,因爲您尚未移動任何代碼。這是好事。

法則五

移動代碼到最後新的結構。測試通過時停止移動代碼。

你不需要分析進口來做到這一點,BTW。您只需使用grep來查找模塊和類。舊進口和舊進口之間的糾結關係並不重要,也不需要分析。你扔掉它。您不需要比grep更智能的工具。

如果感受到移動代碼的衝動,您必須非常嚴謹。 (1)你必須有失敗的測試,然後(2)你可以移動一些代碼來通過失敗的測試。

+1

+1。並且不要忘記'import module.submod as submod'作爲一個變體。它一直在增長。 – aaronasterling 2010-08-26 10:42:31

+0

@aaronasterling:仍然看起來像'r「\ s * import \ s +。*」'給我。 – 2010-08-26 10:58:38

+0

重寫從頭開始往往不切實際,並可能導致杜克公爵永遠症候羣。 – Antimony 2013-01-11 22:46:53

2

chuckmove是一種工具,可讓您在整個源代碼樹中遞歸重寫導入以引用模塊的新位置。

chuckmove --old sound.utils --new media.sound.utils src 

...這下降到src,並重寫導入sound.utils來導入media.sound.utils的語句。它支持所有的Python導入格式。即from x import yimport x.y.z as w