簡體   English   中英

Python跨模塊和全局變量導入

[英]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!

導入模塊時,該模塊中定義的所有變量都可在其命名空間中使用。 因此,如果XYZfile_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM