import
导入包的时候是不能直接使用其中函数的,只有当from import
时才可以,所以特意研究了一下以前一直没有注意过的导包机制。
python中使用import
可以导入很多东西,这次主要研究其中的包和模块,模块是指单个py
文件而包是指具有多个模块或者子包的文件夹,由于本人一直习惯用import不怎么喜欢加from,所以东窗事发突然爆炸,就研究了一下导包。
from import
。
为什么要这样呢,因为导入包名其实是无法直接使用包内的子包和模块的,这点很重要,这也就是为什么有的包只用import时会报错的原因。
很多接触python时间不长或者没怎么研究过导包的童鞋都会认为把一个包import后,里面的模块和子包就都能用了,就算不能用直接from import就可以,但是并没有探究过为什么会这样。
python在只使用import
导入包时只会将包中一级目录下的文件来引入命名空间,再下级的目录并不会进行引入,在同级中模块里的函数并不会检测,所以在使用模块里的函数时需要通过完整的路径调用。
--package
-aa.py
-bb()
现在aa.py中存在函数bb()
我们调用bb()
的时候如果使用的是import package
不能够直接使用package.bb()
来调用这个函数,必须使用package.aa.bb()
来调用,这一点大家应该都能想明白,因为python
在当前文件夹下只能检测到有aa.py
这个文件,但是不可能再去查看aa.py
里面有没有这个函数,如果挨个检测的话稍微大一点的包就要费好长时间,而且内存占用也会很多。
那么如果在这个包中具有一个子包呢,这个时候子包就是个文件夹,python
这里的源码我没有看,但通过猜想以及实验通常应该是在import
一个包后只查找.py
文件,例如我们的目录是这样的:
--package
-aa.py
-sonPackage
__init__.py
-cc.py
-fun()
这个时候如果你只是使用了import package
这个时候如果想要调用cc.py
的fun
函数直接使用package.sonPackage.cc.fun()
是会报错的,报错内容是找不到sonPackage
这里是由于sonPackage是一个文件夹,并不是.py
文件,所以编译器并没有把它引入到命名空间里。
但是这样的话要怎么使用cc.py
呢,这里有两种方式,一个是使用import package.sonPackage
,还有一个是使用from package import sonPackage
,这两种方式都可以让程序运行的时候把包里面的东西引入到命名空间。
但是有一些库用的比较少童鞋或者一直跟着大佬代码导包的童鞋就有一些问题,为啥我看好多包直接就能用啊,根本没写过这么一大堆,这个问题的秘密就在于__init__.py
这个东西了,当你进行导包的时候首先python就会去执行__init__().py
,很多包都是在__init__.py
中把常用的函数或者子包预先导入来方便使用的,这样就会出现我们可以直接使用子包和函数的情况,比如目前我在用的sklearn中其中一个子包的__init__.py中是这么预先导入的:
原创文章 1获赞 1访问量 26
关注
私信
展开阅读全文
作者:code_killerr