解析包为什么解析失败怎么回事(解析包解析失败是什么原因)

作者:小K

来源:麦叔编程

最近发现一个问题,好像很多学Python的同学都搞不清楚库、包和模块之间的区别。

反正这三者都是通过import和from...import...语句实现的,会用就行,也不用在意过多的细节。

直到上周我发现这个问题竟然在某大厂的Python岗位招聘面试中出现,并“迷”倒不少应聘者,我才觉得这个知识有必要普及下。

模块(module)

Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。

简单来说任何一个以.py的文件都可以视为是一个模块(module)。

这个模块的功能可能就只有一个打印Hello World。

「hello_world.py」

def print_hello_world(): print("Hello World")

当一个项目的功能很复杂的时候,我们可以把代码分割成很多不同的模块,主码代码仅保留实现逻辑,

例如:登录、查询、加密、解密....

分割成不同的模块之后,无论维护还是开发都会方便很多。

当某个功能出Bug后,也比较好定位代码中的Bug处。

包(Package)

包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。

简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。

如果说模块是一个py文件的话,那么包就是一个含有__init__.py文件的文件夹。

__init__.py是一个内容为空,且只有一个“名字”的文件。

上图就是一个简单的名字为HelloWorld的包。

假如我们需要将 「打印Hello World」 这个功能做的更加细化,让它根据使用对象,能输出不同语言的Hello World。

那么对于这个功能的实现又会写很多.py文件,但是这些.py文件都是用来支持「打印Hello World」 这个功能的,那么我们最好使用“包”这个方式对代码进行分类/分割。

对于一些第三方的包,或者框架例如Scrapy,Django,flask...往往都是使用“包”(好像说了正确的废话)

例如我们导了django,import导入的将是一个django的文件夹。

库(library)

对于库的定义,和包(Package)有点类似。

在中文网上我没有找到特别满意的文字定义,所以我Google了一下。

A Python library is a collection of related modules. It contains bundles of code that can be used repeatedly in different programs. It makes Python Programming simpler and convenient for the programmer. As we don't need to write the same code again and again for different programs.

Python库是相关模块的集合。它包含可以在不同程序中重复使用的代码包。它使Python编程更加简单和方便。因为我们不需要为不同的程序一遍又一遍地写相同的代码。

一般我们说“库”的时候,会习惯性加上“第三方”,这也无可厚非。

一般能定义成库的,基本上都是完成了特定功能的实现,并得到使用者的肯定,但库的本质是“包”/“模块”。

例如django库,

对于使用的人来说,他是一个库;

但是对于该库作者来说,django就是他写的一个包。

django库实质就是一个包