web-dev-qa-db-ja.com

Pythonプロジェクトの多くのスクリプト間の一般的なインポート

たくさんのソフトウェアの自動インストールスクリプトをPythonで書いています。目的は、スクリプトがディレクトリから圧縮ファイルをフェッチし、各ユーティリティまたはアプリケーションをケースバイケースでインストール/構成することです。

これらはそれぞれ特別な扱いを必要とするため(必要でない場合は例外であり、将来のために準備を整えておきたい必要がある将来的に特別な扱いが必要になる)、それぞれに個別の.pyファイルを用意することにしました。メインスクリプトは、名前の一致に基づいて使用するファイルを自動的に検出し、そのルールは中央の.jsonファイルにあります。

これらの特定のスクリプトの多くは、そのファイルに固有のスクリプトに加えて、ほぼ同じインポートを必要とします。したがって、Cのような言語の場合と同様に、一般的に使用されるモジュールをインポートし、それをすべてのマイナーおよび特定のスクリプトにインポートする「ヘッダー」スクリプトを作成することは理にかなっていると判断しました。

ただし、SO( herehereここ および ここ は少数です)これは絶対に行わないで、必要に応じて各ファイルにモジュールを明示的にインポートするというコンセンサスがあるようです。理由与えられた:

  1. 明示的であり、Pythonの設計哲学に沿っている
  2. テキスト検索だけで依存関係を見つけやすくなります

私はこれらを検討しましたが、それらが私の場合に適用されるかどうか判断できません。 50〜100個の異なるファイルがあり、それぞれにいくつかの一般的なインポートとそのファイルに固有のいくつかのインポートが必要です。すべての一般的なインポートを1つのファイルに入れて、そのファイルをインポートすることは、「自分を繰り返さないでください」に沿っているようです。また、エラーが発生しにくいように見えます(同じインターフェイスを持つ別のモジュールに変更し、importステートメントを変更する必要がある場合はどうなりますか?それが1か所にある場合、私はを知っていますどこでも正しく、それ以外の場合はすべてのファイルで変更する必要があります)。

この特定のプロジェクトの詳細に関係なく、一般に、Pythonの一般的なインポートファイルに対して行うべき良いケースはありますか?

5
mechalynx

ライブラリを必要とするコードを記述している場合、ライブラリのインポートは、そのライブラリを使用するコードよりも必然的に少ないコードです。 2つを同じファイルにまとめると、一方を変更すると、もう一方を忘れずに実行できる可能性が高くなります。特に、エディターがPEPに準拠するためにpyflakesを使用しているため、未使用のインポートに気づいた場合。

非常によく似た多くのスクリプトを作成している場合は、一般的なインポートステートメントで問題が最も少なくなります。代わりに、できるだけ多くの共通コードを共通モジュールに移動し、両方のインポートと、それらのインポートを必要とするコードを有効にします。スクリプトごとのオーバーライドは、構成とサブクラス化の組み合わせで実装できます。これらのサブクラスは、スクリプトに含まれる一般的なものの量が多いため、はるかに短くなります。これは、魔法のインポート手順よりもコードの重複をなくすための方法であり、メンテナーを驚かせることは少ないでしょう。

1
btilly