![](/img/trans.png)
[英]Python 3 isinstance unexpected behavior when importing class from different file?
[英]unexpected behavior when importing packages
我在python中出現了意外的導入行為,我不理解。 希望您能幫助我澄清這種現象。 假設以下項目結構:
.
└── pkgimp
├── __init__.py
└── testing
├── __init__.py
├── mod_a.py
└── mod_b.py
具有以下源代碼:
pkgimg / __ init__.py :
import pkgimg.testing
pkgimg / testing / __ init__.py :
from mod_a import a
from mod_b import b # <- no import of c
pkgimg / testing / mod_a.py :
a = 123
pkgimg / testing / mod_b.py :
b = "foo"
c = "bar" # <- not imported
當我使用import pkgimp
並使用dir(pkgimp.testing)
打印加載的模塊時,我看到了我沒有導入的模塊mod_a
和mod_b
?
這是我得到的:
['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'a', 'b', 'mod_a', 'mod_b']
我假設只有a
和b
會被導入,而mod_a
和mod_b
都不會
此外,我還可以訪問從未被導入到任何地方的c
。
>>> pkgimp.testing.mod_b.c
'bar'
我知道,如果將模塊中的所有內容導入,都將對其進行評估。 但是,我認為, from M import x
將僅給我x
而不是整個模塊的參考!
例如,當我運行以下代碼時:
>>> from pkgimp.testing.mod_b import b
>>> dir()
['__builtins__', '__doc__', '__name__', '__package__', 'b']
Python僅導入b而不是模塊mod_b
。 這是我所期望的。
包中的模塊一旦導入,就始終作為包的屬性添加。
因此, 從其他模塊導入pkgimp.testing.mod_b
時, mod_b
名稱添加到pkgimp.testing
。 這是正常的行為。
在上一個示例中,您從模塊中將特定名稱導入了本地名稱空間。 如果要通過sys.modules['pkgimp.testing.mod_b']
檢查mod_b
模塊,則會發現c
仍在該對象上定義; 將整個模塊加載到內存中,並將對b
的引用添加到您的本地名稱空間中。
同樣在這種情況下, sys.modules['pkgimp.testing']
將具有mod_b
屬性,該屬性是對pkgimp.testing.mod_b
模塊對象的引用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.