2013-08-01 92 views
0

我有兩個文件。代碼看起來像在彼此之間有循環導入。我該如何解決它?我必須使用超級函數來調用第一個文件中的函數。Python - 使用超級函數調用方法的循環導入

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) 
+0

它看起來像第一個文件,'report.py'是進口_itself_ - 我認爲這是實際的問題。 – martineau

+0

對不起,這是一個錯誤 –

回答

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。由於類b.B明確依賴於a.A,因此在執行import b語句時尚未定義,所以這會因AttributeError異常而失敗。

爲了解決這個問題,你可以移動import b語句中的定義背後,是這樣的:

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() 

或者,你可以確保你總是模塊a之前導入模塊b,這也將解決這個問題(因爲沒有導入時DEPE對b)的傾向。

0

沒有 「圓形進口」 的問題在Python。導入已導入的模塊將被安靜地忽略。任何初始化代碼只會在模塊的第一次導入時運行。

即使當某個模塊被賦予一個帶有import ... as的別名,情況也是如此。

0

另一種方式來解決這個問題將是對類HighDetail進入report_y.py