为什么 from scipy import spatial 有效,而 scipy.spatial 在 import scipy 后不起作用?

新手上路,请多包涵

我想在我的代码中使用 scipy.spatial.distance.cosine 。 I can import the spatial submodule if I do something like import scipy.spatial or from scipy import spatial , but if I simply import scipy calling scipy.spatial.distance.cosine(...) 导致以下错误: AttributeError: 'module' object has no attribute 'spatial'

第二种方法有什么问题?

原文由 Paul Baltescu 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 797
2 个回答

导入包不会自动导入子模块。您需要显式导入子模块。

例如, import xml 不导入子模块 xml.dom

 >>> import xml
>>> xml.dom
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'dom'
>>> import xml.dom
>>> xml.dom
<module 'xml.dom' from 'C:\Python27\lib\xml\dom__init__.pyc'>

有一个例外,例如 os.path 。 ( os 模块本身将子模块导入其命名空间)

 >>> import os
>>> os.path
<module 'ntpath' from 'C:\Python27\lib\ntpath.pyc'>

原文由 falsetru 发布,翻译遵循 CC BY-SA 3.0 许可协议

那是因为 scipy 是一个 _包_,而不是一个模块。当你导入一个包时,你实际上并没有加载里面的模块,因此 package.module 会导致错误。

但是, import package.module 会起作用,因为它加载模块,而不是包。

这是大多数 import 语句的标准行为,但也有一些例外。

这是 Python 3 中 urllib 的相同情况:

 >>> import urllib
>>> dir(urllib)
['__builtins__', '__cached__', '__doc__', '__file__', '__initializing__', '__loader__', '__name__', '__package__', '__path__', 'error', 'parse', 'request', 'response']

看?那里没有子模块。要访问它的子模块,我们需要子模块:

 >>> import urllib.request
>>>

希望这个简单的解释对您有所帮助!

原文由 aIKid 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题