0

2 つ (またはそれ以上) の他のモジュールの 1 つからクラスをインスタンス化するクラスを定義するモジュールがあります。以下にいくつかのコード例を示します。最初の例では、2 つのモジュールがインポートされますが、使用されるのは 1 つだけです (MyIo のインスタンスごとに 1 つ)。2 番目の例では、必要なモジュールのみがインポートされます。上位レベルのモジュールには MyIo のインスタンスが 1 つ以上ある場合があります。

import2 番目の例が使用されているものだけをインポートする点は気に入っていますが、「コード実行」セクションで行われている 点はあまり好きではありません。

私の質問は次のとおりです。

  1. どの例がより良いアーキテクチャーの選択であり、その理由は?
  2. 最終的に使用されないモジュールをインポートすることに対するペナルティはありますか?
  3. Python のコード実行セクションでのインポートは「悪い形式」と見なされますか?

この例では、両方のモジュールをインポートしますが、使用するのは 1 つだけです...

''' MyIo.py '''

...
...
from DevSerial import Device as DeviceSerial
from DevUSB import Device as DeviceUSB

class MyIo:

  def __init__(self, port)
    if port.lower() == 'usb':
      self.device=DeviceUSB()
    else:
      self.device=DeviceSerial(port)
...
...

以下は、使用されているモジュールのみをインポートします...

''' MyIo.py '''

...
...
class MyIo:

  def __init__(self, port)
    if port.lower() == 'usb':
      from DevUSB import Device
      self.device=Device()
    else:
      from DevSerial import Device
      self.device=Device(port)
...
...
4

3 に答える 3

1

PEP 8に従って、すべてのインポートはファイルの先頭にまとめる必要があります。それらをファイル全体に分散させると、ソフトウェアの保守とデバッグが困難になります。

私が考えることができる唯一のパフォーマンス オーバーヘッドは、プログラムの起動時です。より多くのモジュールをロードする必要があります。プログラムが実行されると、余分なオーバーヘッドが発生することはありません。

質問に答えるには:

  1. 前者。他のファイルが使用されていることは明らかですが、すべての依存関係を見つけるには 2 番目のファイルを掘り下げる必要があります。
  2. はい、ただし起動時のみです。
  3. はい。
于 2013-01-02T02:56:19.577 に答える
0

実際には、モジュールを関数にインポートしていても、手動で削除しない限り、関数の実行が完了すると、それらはまだ sys.modules に存在します。そうです、コードの先頭に直接インポートしないという意味はありません (例 #1 のように)。

于 2013-01-02T03:01:50.517 に答える
0

ページの上部にぎっしり詰まっているだけではないインポートの最も一般的な用途は、兄弟モジュールが相互に排他的な異なるオプションを表す状況です。最適な例は、適切なモジュールに自動的に交換される os.path です。それでも、差分インポートをコードの下ではなく上で行うのが一般的です。

于 2013-01-02T03:52:30.950 に答える