2014-03-24 48 views
0

我正在寫一個IPythonNotebook並使我的代碼更少聚集,我正在定義一些不在主筆記本中的函數。我把它們放在我導入的外部.py文件中。爲什麼test()不知道u()使全局函數爲已知的導入函數

在myModule.py文件

def test(): 
    number = u()+u() 
    return number 

我的主文件(在筆記本電腦)

from myModul import test 

def u(): 
    bla = 1 
    return bla 


test() 

test()功能全是進口的好,但不知道u

NameError:未定義全局名稱'u'

+2

全局**是**每個模塊**;如果可以找到其他模塊的全局變量,那麼最終會出現難以發現的錯誤。如果在'myModule'中已經定義了def u()'會怎麼樣? –

回答

3

你不能做這個;全局是該函數中定義的模塊中永遠只能擡頭

你會,而不是給你的函數接受u作爲參數一個參數:

def test(u): 
    number = u()+u() 
    return number 

,並在主文件:

def u(): 
    bla = 1 
    return bla 

test(u) 

如果Python按照您期望的方式工作,您會創建許多難以跟蹤的問題,首先要解決哪些名稱空間(如模塊)。

+0

但是你的意思是'def u()',而不是'def def u()',對吧? – user2366975

+0

@ user2366975:是的,那是一個錯字。 –

0

python沒有全局函數的思想 - 函數存在於模塊中。即使變量只在模塊內部是全局的,除非導入它們,否則任何其他模塊都不能看到它們。

所以如果你想讓你的測試函數能夠看到你的函數「U」 - 你需要: 1)將你的mainmodule導入到myModul中 - 當你最終產生循環依賴時,這不是一個好主意。

2)按照傳遞函數u到您的測試功能

3)想想你的代碼的組織的Martijn Pieters的好主意 - 如果你的「測試」功能實際上取決於調用的「u」,那麼他們應該是在不同的模塊中定義?

+0

我同意。但是,這導致了我的問題,如果蟒蛇適用於任何包含超過 - 比如說 - 5000祿的項目。 – user2366975

+0

@ user2366975:爲什麼Python不適合大型項目?例如,Python本身在Python代碼中是430k LOC *;項目代碼庫大約是50/50 Python和C .. –

+0

這個大小的項目不應該依賴於我的視圖中的全局任何東西(並且我有幾個項目遠遠超過5000個loc,沒有全局數據)。使用面向對象的原則,分層的應用程序設計和技術,如將對象作爲對象傳遞,這些項目不僅可行,而且易於開發和測試。 –