簡體   English   中英

導入軟件包時出現意外行為

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

這是我得到的:

['__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', 'a', 'b', 'mod_a', 'mod_b']

我假設只有ab會被導入,而mod_amod_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.

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