Package.module import

时间:2018-03-08 12:58:25

标签: python scipy

所以这是一系列问题,更多的是澄清事情,帮助更好地理解而不是我遇到的问题。

如果我弄错了或者之前已经回答过这些问题,我现在道歉。我无法找到它们。

我想问的第一个澄清是:

让我们假设:

import scipy

首先,我注意到你通常不能通过导入包然后尝试访问package.module来访问包中的模块。

例如scipy.io

您经常需要import package.module甚至import astropy.io.fits,或者您可以from package import module

我的问题是为什么会出现这种情况,为什么它在包装上如此随机?我无法确定任何稳定的模式。 是否因为其中一些库(包)非常大而且为了没有内存问题,它只导入核心属性/模块?

第二个问题:

它涉及实际检查这些包的大小。有什么方法可以看出它们在进口时有多大?有什么方法可以知道什么会起作用,除了尝试之外还有什么胜利?我想我可以查看sys.modules并尝试从那里获取它?

第三个也是最后一个问题:

在我没有在Raspberry Pi上运行代码的情况下,我不必担心内存问题(如果这是他们不允许直接访问的原因),有没有办法实际导入包,这样它还可以加载所有子包?

我只是在懒惰,想知道是否有可能。我知道这不是一种好习惯,但好奇心会杀死这只猫。

只是为了更新并让人们可以访问我看到的相关问题:

这个答案对良好的一般做法提供了很好的建议: What are good rules of thumb for Python imports?

Why can't I use the scipy.io?就像文档解释为什么子包不必导入

然后显然有文档: https://docs.python.org/3/reference/import.html#packages 第5.2.1节是import scipy也不import scipy.io的原因,但我想知道为什么开发人员不会将其变为自动化过程。

这个问题实际上与我的部分问题相似,但似乎没有明确的答案Python complex subpackage importing

问题状况:

问题1:答案中有充分理由

问题2:待定

问题3:待定

3 个答案:

答案 0 :(得分:1)

包由文件__init__.py表示。因此,封装scipyscipy/__init__.py表示。在这个文件中你会看到很多像这样的导入:

from scipy.version import version as __version__

这就是为scipy.__version__工作的原因,即使__version__实际上存在于scipy.version中。并非所有包都这样做。没有规则可以预期这种行为。这完全取决于包裹作者。

答案 1 :(得分:1)

这些导入调用之间的主要区别在于导入模块的命名空间。给出以下示例:

import mypackage
import mypackage.myclass
from mypackage import myclass

第一个示例将__init__.py公开的所有内容导入到包的命名空间中。 I.E.其元素可以mypackage.myclass()访问。第二个示例仅导入mypackage.myclass并仍然将其导入到该包的命名空间中,因此它仍然以mypackage.myclass()的形式访问。第三个示例将mypackage.myclass导入当前命名空间,因此显式访问myclass(),就像您在同一个脚本中自己定义它一样。这可能会隐藏您在别处命名的内容。

另一个重要的用例如下:

import mypackage as mp

这允许您设置要将该包导入的命名空间,可能使其成为速记或更方便的东西。

如果您在调用import scipy时有关为什么scipy不会导入所有内容的问题,那么返回的是导入调用仅导入开发人员在{{1}中指示的内容。 }。特别是scipy,如果你这样做:

__init__.py

您将看到它导入了整个包中使用的一堆类和函数。我怀疑他们故意不导入子模块,以免乱丢你没有使用的东西。也许有一种方法可以自动导入所有内容,但您可能不应该这样做。

答案 2 :(得分:1)

回答Q1

当您导入包,特别是像SciPy这样的大包时,它使用 init .py模块初始化模块,该模块可防止自动导入所有子包/模块以节省空间。我不会进一步讨论这个问题,因为这已经是mentioned in this questiondocumented here,并在其他答案中进行了讨论。

此外,如果您对脚本与模块有疑问,this post具有令人难以置信的描述性。

回答Q2

要查找包裹的大小,我会指向this post about finding package directories,然后this post about reporting the size of a particular directory。你可以创建一些组合代码来为你做这两件事。

回答Q3

更新:不确定如何执行此操作,正常function something() { let a = { "a": "val", "b": [{ "c": "val" }] }; console.log(a); a.b = a.b.map(f => ({ "test": "something" })); } 按照文档中的说明工作(类似于Q1):

  

如果包的from package import *代码定义了名为__init__.py的列表,则它被视为遇到__all__时应导入的模块名称列表