簡體   English   中英

Python模塊導入 - 為什么組件僅在顯式導入時可用?

[英]Python module import - why are components only available when explicitly imported?

我最近安裝了scikit-image版本0.11.3。 我使用的是python 2.7.10。 當我導入整個模塊時,我無法訪問io模塊。

import skimage
img = skimage.io.imread(path_)

給出錯誤:

AttributeError: 'module' object has no attribute 'io'

但是以下不會出錯。

from skimage import io
img = io.imread(path_)

問題:為什么?

快速回答:IO是一個子模塊。 子模塊需要顯式從父模塊導入。

答案很長:從python文檔的第5.4.2節開始:

當使用任何機制(例如,importlib API,import或import-from語句或內置import ())加載子模塊時,綁定將放置在父模塊的命名空間中,並附加到子模塊對象。 例如,如果包垃圾郵件具有子模塊foo,則在導入spam.foo之后,垃圾郵件將具有綁定到子模塊的屬性foo。 假設您有以下目錄結構:

spam/
    __init__.py
    foo.py
    bar.py

和spam / init .py有以下幾行:

from .foo import Foo
from .bar import Bar

然后執行以下命令將名稱綁定到垃圾郵件模塊中的foo和bar:

>>>
>>> import spam
>>> spam.foo
<module 'spam.foo' from '/tmp/imports/spam/foo.py'>
>>> spam.bar
<module 'spam.bar' from '/tmp/imports/spam/bar.py'>

鑒於Python熟悉的名稱綁定規則,這似乎令人驚訝,但它實際上是導入系統的基本功能。 不變量保持是如果你有sys.modules ['spam']和sys.modules ['spam.foo'](就像上面導入之后那樣),后者必須顯示為前者的foo屬性。

它只是Python處理模塊的方式。

一個原因是如果cpython需要掃描子模塊,導入所有模塊然后導入它們的所有子模塊,它會導致導入一個模塊非常慢。

另一個原因是“更好地明確而非隱含”。 當您只需要具有復雜模塊層次結構的一小部分包時,為什么Python應該導入所有可能的內容。

而不是from skimage import io你也可以寫

import skimage.io

然后會找到skimage.io.imread。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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