26

from module import *私は最近、かなり頻繁に使用する一連のコードの保守を任されました。

このコードベースは、インポートの競合/命名のあいまいさ/「この関数は一体どこから来たのか、同じ名前の 1 つを持つインポートされたモジュールが 8 つほどあるのですか!?」という意見がますます一般的になっているほど大きくなっています。

今後は、明示的なメンバーを使用してきました (つまりimport module ... module.object.function()、メンテナンス作業をより読みやすくするためです。

しかし、私は疑問に思っていました.Pythonコードを堅牢に解析し、*インポートステートメントをモジュールインポートステートメントにリファクタリングし、そのモジュールのメンバーへのすべての参照に完全なモジュールパスを追加するIDEまたはユーティリティはありますか?

私たちは metaprogramming/reflection/ inspect/monkeypatching を多用していません。

4

3 に答える 3

4

完全な解決策ではありませんが、私が通常行うことは次のとおりです。

  1. Pydev を開く
  2. *すべてのインポートを削除
  3. optimize importsコマンド ( ) を使用して、ctrl+shift+oすべてのインポートを再度追加します。

問題を大まかに解決します:)


自分でソリューションを構築したい場合は、http://docs.python.org/library/modulefinder.html を試してください

于 2012-10-07T12:34:01.473 に答える
3

言及されている他の関連ツールは次のとおりです。

  • ASTを直接操作しますが、これは使用するには非常に低レベルです。
  • 探している定型コードがたくさん含まれている可能性のあるmodulefinderを使用して、
  • ロープ、リファクタリング ライブラリ (@Lucas Graf)、
  • 自転車の修理屋、リファクタリング ライブラリ
  • で使用されるlogilab-astngライブラリpylint

ピリントの詳細

pylintは、その上に構築された非常に優れたツールastであり、コード内のどこにfrom somemodule import *ステートメントがあるか、またどのインポートが不要かを通知することができます。

例:

# next is what's on line 32
from re import *

これは文句を言うでしょう:

W: 32,0: Wildcard import re
W: 32,0: Unused import finditer from wildcard import
W: 32,0: Unused import LOCALE from wildcard import
... # this is a long list ...

解決に向けて?

上記の出力でpylintは、行番号が示されていることに注意してください。多少の手間はかかるかもしれませんが、リファクタリング ツールを使用すると、これらの特定の警告を確認したり、行番号を取得したり、モジュールをインポートして__all__リストを確認したり、サンドボックスexecfile()ステートメントを使用してモジュールのグローバル名を確認したりできます (それがmodulefinder役立つでしょうか? 多分. ..)。からのグローバル名__all__pylint不平を言う名前のリストを使用すると、2 つset()を取得して、違いを取得することができます。ワイルドカード インポートを特徴とする行を特定のインポートに置き換えます。

于 2012-10-14T02:06:19.973 に答える
0

まさにそれを行うためのリファクタリング ツールを作成しました。Star Namerは、スクリプトのすべてのワイルドカード*インポートを調べて、インポートする実際の関数に置き換えます。

使用法:./star_namer.py module_filename script_filename


すべてのスター インポートを実際の名前に変換したら、from_to_import.pyを使用してそれらを修正できます。これがどのように機能するかです:

  1. スクリプトをpylintで実行し、現在未定義の単語をすべてカウントアップします。

  2. from modname importスクリプトからすべての行を削除します。

  3. スクリプトを pylint で再度実行し、未定義の単語の違いを比較します。

  4. pylintのjson出力を (逆の順序で) 調べて、作成する置換の正確な位置を決定modname.し、正しい場所に挿入します。

このアプローチは、正規表現を使用して自分ですべてのテキストを grep しようとするのではなく、構文処理を高度なユーティリティにオフロードすることで、もう少し堅牢になると思いました。

使用法:from_to_import.py script_name modname

変更を行う前に、どのような変更を行う必要があるかを示します。を押しyて保存します。私がこれまでに見つけた主な問題は、modname.テキストを挿入することによってコメントがずれてしまい、エイリアス化された関数名をうまく処理できないことによって引き起こされるテキストの配置の問題です。(from ... import quickrun as qrun)

完全なドキュメントはこちら: https://github.com/SurpriseDog/Star-Wrangler

于 2021-10-11T17:08:41.770 に答える