[英]Python imports across modules and global variables
我有一個似乎相當基本的問題,但我似乎無法在任何地方找到任何幫助。
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'未定義即使從file_a完成的標准導入(如'import sys')似乎也無法使其在file_b中可用。 我認為應該工作。 我的理解錯了嗎? 如果是,那么有沒有辦法在文件中包含常見的導入和全局變量? (如果它有幫助,我一直是C ++和java程序員,現在我開始使用python。)
我的理解錯了嗎?
是的,因為from file_a import A
的一行from file_a import A
只將類A
導入到file_b
的命名空間中。 file_a
的命名空間file_a
。 如果它不是這樣的話,那么兩種語法都沒有意義:
import modulename
from modulename import something
好像你的想法是正確的,然后在第二個表格后你總是可以使用modulename.someotherthing
。
如果是,那么有沒有辦法在文件中包含常見的導入和全局變量?
是的,使用星號*
運算符:
from modulename import *
但這帶來了命名空間污染的問題,例如from file_a import *
將在file_b
導入所有在file_a
完成的file_a
。 你最終將失去對你的進口的控制權,這會在某個時候咬你...相信我!
當出於某種原因需要from module import *
,命名空間污染的一種解決方法是在module
定義變量__all__
,該變量將使用星號運算符導入的內容列入白名單。
HTH!
導入模塊時,該模塊中定義的所有變量都可在其命名空間中使用。 因此,如果XYZ
在file_a
模塊中可用,則在import file_a
,可以將XYZ
作為file_a.XYZ
訪問。
這里的一般想法是,您的命名空間不應該與其他命名空間的內容混在一起。
是的,你的理解是錯誤的。 每個模塊都是自己的命名空間,只有您在該文件中顯式導入的內容才可在該命名空間中使用。
與其他答案相反,引用file_a.XYZ
並不是特別Pythonic,盡管這會起作用。 相反,您應該在file_b
的頂部導入XYZ和sys。
import file_a
from file_a import A
我認為問題是:你真的不進口XYZ!
from fila_a import *
可以解決你的問題,但這不是一個好方法~~~
你可以在file_b中寫這個:
from file_a import XYZ
它完成了嗎?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.