点击关注我哦
一篇文章带你了解如何优雅的创建__init__.py文件
什么是 Python 包?
《数据科学家的模块化编程指南》文章中,我们介绍了:Python 包只是一个有组织的 Python 模块集合,而 Python 模块只是一个单独的 Python 文件。
为什么我要使用__init__.py?
使用 _init _. py 创建一个软件包就是为了让开发更大的 Python 项目变得更容易。它提供了一种机制,可以将单独的 python 脚本分组到单个可导入模块中。
让我们来看一些例子
理解为什么要使用__init__.py并且学习如何使用它来创建一个包的最好方法是通过一些快速的例子运行!最好的学习方法就是实践!
本教程中的代码应该适用于 Python 3。
假设我们创建了三个模块:
someFolder|-- stringLength.py|-- stringToUpper.py`-- stringToLower.py
记住,模块只是任何单个 python 文件的另一个名称
对于我们的例子,这些文件的内容如下:
# stringLength.py
def stringLength(inStr): return len(inStr)
# stringToUpper.py
def stringToUpper(inStr): return inStr.upper()
# stringToLower.py
def stringToLower(inStr): return inStr.lower()
显然,这些函数是无用的,但是作为一个基本概念的模型是有帮助的,我们已经编写了一些以某种方式相关的 python 模块。
那么,如果不创建一个包并使用 _init _. py,我们如何使用这些文件中的函数呢?
我们只能导入这些文件,如果它们位于我们正在运行的脚本所在的工作目录中。
我们可以在一个新的 Python 脚本中使用这些文件,但有一个关键的警告:
The files must be in the same directory as the script we are trying to use them in.
为了说明这一点,让我们创建一个名为 example1.py 的文件,它利用了我们的模块:
# example1.py
import stringLengthimport stringToLowerimport stringToUpper
some_string = "Hello, Universe!"
print(stringLength.stringLength(some_string))print(stringToLower.stringToLower(some_string))print(stringToUpper.stringToUpper(some_string))
添加一个空白__init__.py
如果我们想要将这些脚本分离到一个文件夹中,以使它们更有组织性,那会怎么样呢?
这就是 __init__. py文件发挥作用的地方。
首先,让我们将脚本移动到一个新的子文件夹中,并将其命名为 string _func。然后在该文件夹中创建一个名为__init__.py 的空文件。
下面是我们新的文件/文件夹结构:
someFolder|-- string_func| |-- __init__.py| |-- stringToUpper.py| |-- stringToLower.py| `-- strengthLength.py`-- example1.py
所以,现在让我们测试一下__init__. py到底允许我们做什么:
让我们创建一个新的 example2.py 文件。
# example2.py
import string_func.stringLengthimport string_func.stringToLowerimport string_func.stringToUpper
some_string = "Hello, Universe!"
print(string_func.stringLength.stringLength(some_string))print(string_func.stringToLower.stringToLower(some_string))print(string_func.stringToUpper.stringToUpper(some_string))
现在,我们可以以这种方式访问字符串函数。这很好,因为它们都在一个独立的文件夹中,但语法肯定不是很简洁。让我们看看我们是否可以通过编辑 __init__. py来改善一下。
将import 加入到__init__.py中
打开你的__init__.py文件并做以下更改:
# __init__.pyfrom .stringLength import stringLengthfrom .stringToLower import stringToLowerfrom .stringToUpper import stringToUpper
因此,在我们的__init__.py中,我们现在可以将代码缩短为:
# example3.py
import string_func
some_string = "Hello, Universe!"
print(string_func.stringLength(some_string))print(string_func.stringToLower(some_string))print(string_func.stringToUpper(some_string))
现在语法变得更简洁了,你可以看到 string _ func 调用函数就像它使用自己的模块一样。
所以,这基本上就是__init__.py的功劳!它允许您将目录当作 python 模块来处理。然后可以在__init__.py文件中进一步定义和导入,或者也可以将该文件保留为空白。
调试import问题
对于调试import的问题,一般有三个基本的技巧:
1. 使用交互式解释器(REPL)导入模块,并查看是否得到了所期望的结果;
2. 使用 python -v -m my _ scriptname.py 启动脚本,然后检查输出,确切查看从哪里导入模块;
3. 使用 Pycharm。Pycharm 神奇的内省能力意味着您将立即知道您的模块是否被正确导入,因为如果没有导入,它将表明一个错误。它有时也会建议进行适当的修正。社区版是免费的,如果你是一个学生,你可以免费订阅他们的所有产品!
· END ·
HAPPY LIFE