所以这是一系列问题,更多的是澄清事情,帮助更好地理解而不是我遇到的问题。
如果我弄错了或者之前已经回答过这些问题,我现在道歉。我无法找到它们。
让我们假设:
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:待定
答案 0 :(得分:1)
包由文件__init__.py
表示。因此,封装scipy
由scipy/__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)
当您导入包,特别是像SciPy这样的大包时,它使用 init .py模块初始化模块,该模块可防止自动导入所有子包/模块以节省空间。我不会进一步讨论这个问题,因为这已经是mentioned in this question,documented here,并在其他答案中进行了讨论。
此外,如果您对脚本与模块有疑问,this post具有令人难以置信的描述性。
要查找包裹的大小,我会指向this post about finding package directories,然后this post about reporting the size of a particular directory。你可以创建一些组合代码来为你做这两件事。
更新:不确定如何执行此操作,正常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__
时应导入的模块名称列表