2015-11-06 76 views
0

在Python 2.7,我越來越無法拆分大型Python模塊

'模塊' 有沒有屬性

,和/或

'名' 是未定義

錯誤,當我試圖分裂一個大的python文件。

(我已經看過類似的帖子和Python模塊文檔)

假設你有構造這樣一個Python文件:

<imports> 

<50 global variables defined> 

<100 lengthy functions that each use most or all of the globals 
defined above, and also call each other> 

<main() that calls some of the functions and uses the globals> 

所以我可以很容易地分類的功能組合在一起,爲每個組創建一個python文件,並將它們放在那裏。問題是每當我嘗試從主python文件中調用它們中的任何一個時,我都會遇到上面列出的錯誤。我認爲這個問題與循環依賴有關。由於所有的函數都依賴於全局變量,而且相互之間都是循環依賴的。

如果我有main_file.py,group_of_functions_1.py和group_of_functions_2.py,

main_file.py將有:

import group_of_functions_1.py 
import group_of_functions_2.py 

和group_of_functions_1.py將有

import main_file.py 
import group_of_functions_2.py 

和group_of_functions_2.py將有

import main_file.py 
import group_of_functions_1.py 

無論我使用「import package_x」還是「from package_x import *」,問題依然存在。

如果我採取的擺脫全局的路線,那麼大部分的功能將有50個參數,它們將在繞過,然後還需要返回

什麼是清理它的正確方法?

(我已經看過類似的帖子和Python模塊文檔)

+4

*「如果我採取擺脫全局的路線」 - - 是的,那麼。 *「大部分函數都會有50個參數傳遞,然後還需要返回」* - 然後將相關參數封裝在某種對象中,這是一個非常常見的重構模式(參見例如https:// sourcemaking.com/refactoring/introduce-parameter-object) – jonrsharpe

+0

我懷疑你沒有使用自定義[類](https://docs.python.org/3/tutorial/classes.html#a-first-look-在你的代碼中)。希望一旦你將這些全局變量轉換成類,你的大部分依賴問題就會消失,並且把你的主要功能變成這些類的方法。它可能需要一些思考(並努力工作)來重新安排當前的設計,但從長遠來看這將是值得的。您的代碼將變得更易於閱讀,理解,維護和測試。 –

+0

因此,考慮jonrsharpe的建議,我剛剛創建了一個類Parameters(),它只包含一個__init __(self)方法,其中包含所有50多個變量。然後在main_file.py中,我首先初始化params = Parameters(),並將該params對象全部傳遞給該地方。 – John

回答

2

你的一個錯誤的來源可能是以下幾點:

import group_of_functions_1.py 
import group_of_functions_2.py 

導入時,你不加.py到模塊名稱的結尾。代之以:

import group_of_functions_1 
import group_of_functions_2