0

私は2つのファイルを持っています。コードは、相互に循環インポートを行っているようです。どうすれば解決できますか?最初のファイルで関数を呼び出すには、スーパー関数を使用する必要があります。

report.py

import report_y as rpt
from aldjango.report import BaseReport

class Report(BaseReport):
    def gen_x(self):
        output = rpt.Ydetail(*args)
        ....
        #code that generate a PDF report for category X

class HighDetail(object):
    def __init__(self, *args, **kwargs):
        ....   
     #functions that generate output

report_y.py

from report import HighDetail
class YDetail(HighDetail):
    #do something override some argument in HighDetail method
    new_args = orginal args + new args
    super(YDetail, self).__init__(*new_args, **kwargs)
4

3 に答える 3

1

問題を再現するために、より簡潔で最小限の例を書きました。

a.py

import b

class A(object):

  def get_magic_number_from_b(self):
      return b.magic_number()

b.py

import a

def magic_number():
  return 42

class B(a.A):
  pass

あなたの例と同様に、モジュール b のクラス B は、モジュール a のクラス A から継承します。同時に、クラス A はその機能を実行するためにモジュール b からのいくつかの機能を必要とします (一般に、可能であればこれを避けるようにしてください)。ここで、モジュール a をインポートすると、Python はモジュール b もインポートします。クラス bB は、ステートメントの実行AttributeError時にまだ定義されていない aA に明示的に依存しているため、これは例外で失敗します。import b

この問題を解決するには、次のようにimport bステートメントを A の定義の後ろに移動します。

class A(object):

  def get_magic_number_from_b(self):
    return b.magic_number()

import b

、または次のように、モジュール b の機能に依存する関数の定義内に移動します。

class A(object):

  def get_magic_number_from_b(self):
    import b
    return b.magic_number()

b別の方法として、必ず module の前に moduleをインポートするようにすることもできますa。これにより、問題も解決されます (a には b に対するインポート時の依存関係がないため)。

于 2013-08-01T16:50:26.637 に答える
0

Python には「循環インポート」の問題はありません。すでにインポートされているモジュールのインポートは、静かに無視されます。初期化コードは、モジュールの最初のインポート時にのみ実行されます。

これは、モジュールに import...as でエイリアスが与えられている場合でも当てはまります。

于 2013-08-01T16:22:23.097 に答える