2017-07-17 83 views
0

我是Python新手,如果在編寫此問題時沒有使用適當的白話,我表示歉意。我在Windows機器上使用Python 3.6.1。我提供了我遇到的問題的一個工作示例。加載具有相關類的模塊

假設我寫了一個保存在Demo_func.py文件中的模塊。它包含以下功能:

def chebyshev_nodes(degree, domain): 
    return Chebyshev.basis(degree,domain).roots() 

我然後運行下面的腳本:如果不是我寫我的腳本中的函數chebyshev_nodes

NameError: name 'Chebyshev' is not defined

from numpy.polynomial.chebyshev import Chebyshev 
from Demo_func import chebyshev_nodes 

chebyshev_nodes(5, [1,5]) 

它產生這個錯誤下面,那麼它工作得很好。

from numpy.polynomial.chebyshev import Chebyshev 
def chebyshev_nodes(degree, domain): 
    return Chebyshev.basis(degree,domain).roots() 

chebyshev_nodes(5, [1,5]) 

我的理解是,進口的切比雪夫是全球性的。但不知何故,它在我的模塊Demo_func中運行。我如何編寫一個依賴於Chebyshev類的模塊?

+1

「我的理解是,進口切比雪夫是全球性的」 - 事實並非如此。它執行的模塊初始化是全局性的,但它只會使'Chebyshev'名稱可用於執行導入的範圍。 – user2357112

+0

謝謝,這很有幫助。在函數定義中導入Chebyshev。這是做到這一點的正確方法嗎? –

回答

-1

正如user2357112在上面的註釋中指出的那樣,模塊是全局初始化的,但名稱不是。該解決方案涉及在Demo_func.py文件中的函數中加載Chebyshez類。

def chebyshev_nodes(degree, domain): 
    from numpy.polynomial.chebyshev import Chebyshev 
    return Chebyshev.basis(degree,domain).roots() 
+0

對不起,但這是一個錯誤的答案。雖然它可以工作,但沒有任何理由在函數體內導入'Chebyshev'。它可以並應該在模塊'Demo_func'的範圍內導入。在這個例子中沒有循環導入問題,所以像函數體中的導入這樣的變通辦法只會模糊代碼。而且通道的進口表明項目佈局設計不好。不要誤解我的意思。我不打算提供另一個獲得聲望的答案。把導入放在它應該是的地方(讓你知道它)然後我把-1改成+1。 – ElmoVanKielmo

+1

謝謝。我刪除了答案標籤。我並不關心虛擬聲譽。我提供了一個迴應,因爲我討厭讓事情沒有完成。 我仍然在學習如何類,範圍和命名空間,主要是由試驗和錯誤。我從你的評論中瞭解到,我可以在'Demo_func.py'文件的頂部導入'Chebyshev'。它的工作原理和你說的更清潔。我曾嘗試過,但我認爲它沒有工作,因爲我沒有重新啓動內核。學過的知識。 –