2011-11-17 229 views
6

我有一個問題似乎是相當重要的,但我似乎無法在任何地方找到任何幫助。Python導入模塊和全局變量

file_a.py >> 

from xyz import XYZ 
class A: 
    . 
    . 
    . 

file_b.py >> 

import file_a 
from file_a import A 
class B(A): 
    def __init__(self): 
     A.__init__(self) 

    def someMethod(self): 
     XYZ.doSomething() 

XYZ.doSomething()失敗說NameError:名字「XYZ」是沒有定義 即使進口標準像「進口SYS」完成從FILE_A似乎並沒有呈現在FILE_B使用。我認爲應該工作。我的理解錯了嗎?如果是的話,那麼是否有一種方法可以跨文件共同導入和全局變量? (如果沒有幫助,我已經是C++和java程序員,現在開始使用python。)

回答

5

Is my understanding wrong?

是,由於線路from file_a import A僅導入A類成file_b的命名空間。 file_a的名稱空間單獨存在。如果不喜歡這個,就沒有什麼意義,在帶有語法:

import modulename 
from modulename import something 

,好像你的想法是正確的,那麼第二個表單後,你總是可以使用modulename.someotherthing

If yes, then is there a way to have common imports and global variables across files?

是,與明星*操作:

from modulename import * 

,但由此帶來的命名空間污染問題,例如from file_a import *將在file_b進口也都在做file_a進口。你最終失去對你的進口的控制,這會咬你一段時間......相信我這一點!

當需要某種原因from module import *,一個解決方法的命名空間污染是modulevariable __all__定義,其中白名單應該怎樣與明星運營商進口。

HTH!

4

當您導入模塊時,該模塊中定義的所有變量都在其命名空間中可用。因此,如果XYZfile_a模塊中可用,則當您import file_a時,您可以訪問XYZ作爲file_a.XYZ

這裏的一般想法是你的命名空間不應該與其他命名空間的內容混雜在一起。

1
import file_a 
from file_a import A 

我覺得問題是:你真的不導入XYZ!

from fila_a import * 

可以解決你的問題,但它是不是一個好辦法~~~

您可以在FILE_B這樣寫:

from file_a import XYZ 

這是做什麼?

3

是的,你的理解是錯誤的。每個模塊都是它自己的名稱空間,只有您在該文件中明確導入的內容才能在該名稱空間中使用。

與其他答案相反,它不是特別Pythonic來參考file_a.XYZ,雖然這將工作。相反,您應該在file_b的頂部導入XYZ和sys。

+0

那是我的問題。我想避免重複一些像file_b這樣的許多文件的導入。我知道將XYZ和sys導入到file_b工作。 – ksrini

+1

@ksrini你不應該這樣。明確導入模塊使用的所有內容是很好的。它整齊地在一個地方列出所有的依賴關係。參見PEP20 - 顯式比隱式更好。 – yak

+0

謝謝犛牛,這很有趣和有見地! – ksrini