17

クリーンアップ、再編成、およびリファクタリングしたい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)、main.pyで使用されていないため削除できるファイルなどを知ることができるようにします(実際に作業しています約 60 モジュール)

これを行うスクリプトを作成することは、おそらくそれほど複雑ではありません(ただし、処理する import にはさまざまな構文があります)。このためのツールには、おそらく使用されていないクラスと関数を通知するなど、他の優れた機能が含まれている場合があります)。

コードの再編成を支援するツール (単純なスクリプトであっても) を知っていますか?

私がやろうとしていることをより正確に表す用語を知っていますか? コードの再編成?

4

4 に答える 4

15

Pythonmodulefinderはこれを行います。この情報をインポートグラフ(たとえばgraphvizでレンダリングできます)に変換するスクリプトを作成するのは非常に簡単です。ここに明確な説明があります。あなたのためにすべての仕事をするものもsnakefoodあります(そしてASTも使用します!)

より一般的なメンテナンスタスクを調べpylintたり、調べたりすることをお勧めします。pychecker

于 2010-08-26T09:32:38.610 に答える
4

これを行うスクリプトを作成することは、おそらくそれほど複雑ではありません (ただし、処理する import にはさまざまな構文があります)。

些細なことです。とがありimportますfrom module import。処理する 2 つの構文。

私がやろうとしていることをより正確に表す用語を知っていますか? コードの再編成?

デザイン。それはデザインと呼ばれます。はい、既存の設計をリファクタリングしていますが...

ルール 1

あなたが持っているもので設計作業を始めないでください。そうした場合、「端をかじる」だけで、小さな、時には取るに足らない変更を行うだけです。

ルール 2

もっと頭が良かったら手に入れていたはずのものからデザインの取り組みを始めましょう。自分が本当にすべきことについて、広く明確に考えてください。あなたがしたことは無視してください。

ルール 3

正しいパッケージとモジュール アーキテクチャを使用して、ゼロから (または一部の人々が言うように de novo)設計ます

このために別のプロジェクトを作成します。

ルール 4

最初にテストします。新しいアーキテクチャの単体テストを作成します。既存の単体テストがある場合は、それらを新しいプロジェクトにコピーします。新しいアーキテクチャを反映するようにインポートを変更し、テストを書き直して、輝かしい新しい簡素化を表現します。

コードを移動していないため、すべてのテストが失敗します。それはいい。

ルール 5

コードを新しい構造体に最後に移動します。テストに合格したら、コードの移動を停止します。

ところで、これを行うためにインポートを分析する必要はありません。grepモジュールとクラスを見つけるために使用しているだけです。古いインポートと古いインポート間のもつれた関係は問題ではなく、分析する必要もありません。あなたはそれを捨てています。より賢いツールは必要ありませんgrep

コードを移動したいという衝動を感じた場合は、非常に訓練する必要があります。(1)失敗するテストが必要であり、(2)失敗したテストに合格するようにコードを移動できます。

于 2010-08-26T10:28:59.343 に答える
2

チャックムーブは、ソース ツリー全体のインポートを再帰的に書き換えて、モジュールの新しい場所を参照できるようにするツールです。

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

...これは src に降りて、sound.utils を import するステートメントを代わりに import media.sound.utils に書き換えます。Python インポート形式の全範囲をサポートしています。すなわちfrom x import yimport x.y.z as w等。

于 2016-01-14T20:10:11.623 に答える
1

Modulefinder は Python 3.5* では機能しない可能性がありますが、pydepsは非常にうまく機能しました。

インストール:

sudo apt install python-pygraphviz
pip install pydeps

次に、マップ元のディレクトリで、

pydeps --max-bacon=0 .

..最大深度のマップを作成します。

*Python 3.6 ではなく Python 3.5 の問題により、モジュールファインダーで次のような問題が発生しました

于 2018-09-27T12:35:08.313 に答える