2013-05-31 11 views
1

鹼/ DIR1/a.py的Python中的曲線圖的對等節點之間的週期性進口

from base.dir2.b import B 

class A: 
    def get_peer(self): 
     return B() 

鹼/ DIR2/b.py

from base.dir1.a import A 

class B: 
    def get_peer(self): 
     return A() 

這實際上表示在一個非常複雜的對等關係樹。 A是一種葉節點,B是另一種葉節點。他們可以互爲對方。

這不起作用,因爲我有一個週期性的進口。

我想弄清楚什麼是最佳項目結構,使得A & B可以實例化對方而不會導致週期性導入。

編輯:我真的很喜歡一個解決方案,不會是這樣的:

import base 

class A: 
    def get_peer(self): 
     return base.dir2.b.B() 

這是當我開始走這路的實際代碼了嚴重的混亂。

回答

2

如果您可以導入模塊而不是類,它應該正常工作。

你應該只能夠做

import base.dir2.b as b 

縮短名字的東西管理。

+0

因此,既然問題是,我的代碼,現在變成一個爛攤子: C = base.dir2.bB() 請記住,這在實際的代碼被簡化名稱較長,他們在單個語句中多次引用。這是荒謬的笨拙。 – amirpc

+0

@amirpc'進口ridiculously.long.name.of.module作爲短名稱' –

+0

這是我見過要做到這一點的最好方式,謝謝! – amirpc

1

它失敗,因爲它試圖在「編譯時」解析導入。如果你做了遲來的進口,它的工作。後期導入(第一次後)的成本只是sys.modules中的一個查詢,所以沒有理由不這樣做,除非它很時髦。解釋你爲什麼時髦的好評可以幫助你。

# A.py 
from base.d1 import B 

class A: 
    def get_peer(self): 
     return B() 

# B.py 
class B: 
    def get_peer(self): 
     from base.d2 import A 
     return A() 

# If you want to be cool and make hard-to-maintain code to reuse crappy pattern 
import importlib 

class Base(object): 
    peer = None 
    def get_peer(self): 
     if not self.peer: 
      raise ValueError("Missing peer") 
     mod = '.'.join(self.peer.split('.')[:-1]) 
     cls = self.peer.split('.')[-1] 
     return getattr(importlib.__import__(mod), cls) 

class A(Base): 
    peer = 'base.d2.B' 
+0

這就是我解決的問題。沒有幫手的版本。 – amirpc

相關問題