2016-07-28 75 views
0

我正在編寫一個程序,它從不同的服務請求用戶信息,並以某種方式將它們放在一起。管理的東西,並做一些鬆散的互動。 我所有的python項目都會在特定的大小時出現問題。導入開始變爲遞歸,處理周圍的數據變得煩人。Python類,數據結構和適當的體系結構

我剛剛遇到的一個問題的一個簡單例子就可以用這個簡單的例子來展示。我有一個主要模塊(這裏是A)創建主要對象(單身人士)。 這些對象需要互相調用函數,所以我使用main作爲連接器。在這個給定的例子中,我不明白B何時創建它從A請求的列表是(None)NoneType。吸氣劑功能不一定是我的方式,但它有助於另一種情況。你有沒有什麼提示,指出如何構建中型python程序。謝謝!

import B 

some_list = None 
b = None 

def get_list(): 
    return some_list 

if __name__ == "__main__": 
    some_list = [1,2,3] 
    b = B.B() 
    print b.my_list 

而模塊B

from A import get_list 

class B: 
    def __init__(self): 
     self.my_list = get_list().map(lambda v : v * 2) # CRASH HERE! 

回答

3

你有現在的主要模塊的副本,每個副本中sys.modules一個單獨的條目:

  1. 最初的Python腳本,從開始命令行始終稱爲__main__

  2. 您導入了A.py文件作爲A模塊。這是單獨__main__模塊。

是的,相同的源文件提供了兩個模塊,但Python認爲它們是不同的。

因此,該第二個副本沒有執行if __name__ == '__main__':塊,因爲__name__變量被設置爲'A'。因此,A.some_listA.b仍然設置爲None;您需要__main__.some_list__main__.b

請不要將代碼放在其他模塊需要導入才能訪問的主入口點。 傳遞這樣的依賴關係,或讓它們由主模塊和其他模塊可以導入的單獨模塊管理。

你可以,例如,通過在功能上與B()類:

b = B.B(get_list) 
+0

MMH不知道,如果它是一個版本的東西(2.7.11),但我不能用'__main__'爲:' NameError:全局名稱'__main__'未定義.. – ramin

+0

@ramin:這不是Python版本的東西。你沒有導入'__main__'。 –

+0

即使是pycharm抱怨沒有找到__main __導入它的作品 - 固定地圖後fct:D謝謝! – ramin