Skip to content

2. 工作环境的搭建

2.1. Python 3.8.1

本文档中的示例已在 Windows 10 系统上使用 Python 3.8.1 解释器进行测试,该解释器可从 URL |https://www.python.org/downloads/|(2020 年 2 月)获取:

Image

安装 Python 后,会在程序列表中生成文件目录 [1] 以及菜单项 [2]

Image

  • [3-4]:两个交互式 Python 解释器;
  • [5]:Python 文档;
  • [6]:Python 模块文档;

我们不会使用交互式 Python 解释器。只需知道本文档中的脚本可以使用该解释器执行即可。虽然它对于测试 Python 功能的运行非常方便,但对于需要重复使用的脚本来说,其实用性并不高。以下是一个使用上述 [4] 选项的示例:

Image

提示符 >>> 允许输入 Python 指令并立即执行。上面输入的代码含义如下:

1
2
3
4
5
6
>>> nom="tintin"
>>> print("nom=%s" % nom)
nom=tintin
>>> print("type=%s" % type(nom))
type=<class 'str'>
>>>

  • 1:变量初始化。在 Python 中,变量无需声明类型。它们会自动采用所赋值的类型。该类型可能会随时间变化;
  • 2:显示名称。'nom=%s' 是一种显示格式,其中 %s 是表示字符串的格式参数。nom 是实际参数,将代替 %s 显示;
  • 3:显示结果;
  • 4:变量 nom 的类型显示
  • 5:此处变量 nom 的类型为 class。在 Python 2.7 中,其类型将显示为 <type 'str'>

现在,我们打开一个 Windows 控制台:

Image

我们能够输入 [python] 并将其替换为 [1],且可执行文件 [python.exe] 已被找到,这表明该文件位于 Windows 机器的 PATH 目录中。 这一点很重要,因为这意味着 Python 开发工具能够找到 Python 解释器。可以通过以下方式进行验证:

Image

  • [2] 中,退出 Python 解释器;
  • [3] 处,该命令显示了 Windows 机器上可执行文件的 PATH;
  • [4] 中,可以看到 Python 3.8 解释器的文件夹属于 PATH;

2.2. IDE PyCharm 社区

2.2.1. 简介

为了构建和运行本文档中的脚本,我们使用了 [PyCharm] Community 版编辑器(2020 年 2 月发布),可在 URL |https://www.jetbrains.com/fr-fr/pycharm/download/# 获取section=windows| :

Image

下载 IDE、PyCharm 和 [1-3] Community 版本并进行安装。

启动 IDE PyCharm,然后创建第一个 Python 项目:

Image

Image

  • [2-4] 中,创建一个新项目;

IDE PyCharm 显示所创建的项目如下:

Image

  • [2-3] 中,查看 IDE 的属性;

Image

  • [4] 中,指定了该项目将使用的 Python 解释器;
  • [5] 中,显示可用解释器的下拉列表;
  • [6] 中,选择在 |Python 3.8.1| 部分下载的解释器;

Image

  • [7] 中,所选的解释器;
  • [8] 中,列出了该解释器可用的包列表。这些包包含 Python 脚本可使用的模块。目前有数百个模块可供使用;

首先,我们创建一个文件夹来存放我们的第一个 Python 脚本:

Image

  • 右键单击项目,然后选择 [1-2] 创建文件夹;
  • [3] 中输入文件夹名称:该文件夹将创建在项目文件夹内;

然后创建一个 Python 脚本:

Image

  • 右键单击文件夹 [bases],然后选择 [1-3]
  • [4-5] 中,输入脚本名称;

编写我们的第一个脚本:

Image

  • [3] 中,我们编写以下脚本:

    • 第 1、3 行:注释以 # 符号开头;
    • 第2行:变量初始化。Python不声明变量的类型;
    • 第 4 行:屏幕输出。此处使用的语法为 [format % données],格式为:
      • 格式:name=%s,其中 %s 表示字符串的位置。该字符串将在表达式的 [données] 部分中找到;
      • 数据:变量 [nom] 的值将替换格式字符串中的 %s 格式;
    • 使用 [4-5],根据 Python 管理机构的建议重新格式化代码;

右键单击代码 [6] 即可执行脚本:

Image

  • [7] 中,执行的命令;
  • [8],即执行结果;

要执行文档中的脚本,请将代码下载至 URL |https://tahe.developpez.com/tutoriels-cours/python-flask-2020/documents/python-flask-2020.rar| 文件中,然后在 PyCharm 中按以下步骤操作:

Image

  • [1-2] 中,打开现有项目:指定已下载代码的文件夹;
  • [3] 中,打开该项目;
  • [4-5] 中,执行项目中的某个脚本;

Image

  • [7-8] 中,显示执行结果;

2.2.2. 虚拟运行环境

我们的工作环境现已就绪。不过,我们将对其进行调整以编写本课程的脚本。首先,修改 Pycharm 的配置:

Image

在右侧窗口中:

  • 默认情况下,[1] 复选框是勾选的。取消勾选该选项,以便 Pycharm 不再默认打开上次打开的项目,而是让我们自行选择要打开的项目;
  • [2] 配置下,关闭应用窗口时不会确认退出 Pycharm;
  • [3] 中,新项目将在另一个窗口中打开;
  • [4] 中,如果关闭 PyCharm 且有程序正在运行,该程序将被终止;

现在关闭 PyCharm 然后重新打开它:

Image

  • [1] 中,创建一个新项目;
  • [2] 处,指定项目文件夹;
  • [3] 中,请使用虚拟环境。虚拟环境专属于所创建的项目,不会与其他项目的虚拟环境混淆。 一个 Python / Flask 项目会使用许多需要安装的外部库。项目 P1 可能使用库 B 的 v1 版本,而项目 P2 可能使用同一库 B 的 v2 版本。这两个版本的兼容性可能参差不齐。 然而,当安装库的 v2 版本时,如果系统中已存在 v1 版本,v1 版本将被 v2 版本覆盖。如果新版本 v2 与 v1 版本不完全兼容,这可能会给使用 v1 版本的项目带来问题。为避免此类问题,我们将每个项目隔离在虚拟环境中;
  • [4] 中,指定项目过程中下载的 Python 库的存放目录。这里我们选择了项目文件夹内的 [venv](虚拟环境)目录。这并非强制要求;
  • [5] 中,选择项目的 Python 解释器。即我们在上一步骤中安装的那个;
  • [6] 中,创建项目;

Image

  • [7-8] 中,显示已创建的项目;
  • [9] 中,项目的运行环境,称为虚拟环境;
  • [10] 中,文件夹 [site-packages] 是用于存放后续下载的库的文件夹;

2.2.3. Git

接下来,启用源代码管理软件。此处使用的是 Git [1-4]

Image

源代码管理软件(VCS:Version Control System)可用于追踪项目的演变过程。 通过称为“提交”commit)的操作,可以对项目在不同阶段进行“快照”。如果在时间点 T 和 T+1 分别进行两次提交,VCS 便能显示这两个已提交版本之间的差异。 通常,VCS由开发团队使用。开发人员在代码经过充分测试后进行提交。其他开发人员可以从VCS检出这部分已通过验证的代码并加以使用。

在此场景中,仅有一名开发人员。经验表明,应用程序可能在时间点 T 正常运行,但在时间点 T+1 却无法运行。此时,我们希望回溯到时间点 T 重新开始。VCS 支持这一操作,因此我们将在此使用它。

下面将演示如何使用 Git 进行操作。

Image

  • [1] 中,选择 [Git] 选项卡(左下角);
  • [2] 中,可以看到该项目中有 495 个文件未被 Git 版本控制。这意味着在提交时,这些文件将不会包含在项目中;
  • [3] 中,是 [commit] 的按钮,即项目确认按钮。 如前所述,Git 此时会为项目生成一个快照,并将其存储在项目根目录下的 [.git] 文件夹中(Pycharm 不会显示该文件夹,但在 Windows 资源管理器中可见);

让我们以当前状态提交该项目。

  • [4] 中,列出了未版本化的文件;
  • [5] 中,所有这些未版本化的文件均属于虚拟环境 [venv]
  • [6] 中,每次提交都必须附带一条提交信息。开发人员在此处记录即将提交的版本相对于上次提交版本所做的修改;

某些文件夹或文件可能被 Git 忽略。因此它们永远不会被纳入 Git 快照。在上述 [5] 中,右键单击文件夹 [venv]

  • [1-3] 中,我们指定文件夹 [venv] 不应包含在 Git 的快照中。Git 忽略的文件夹和文件列表被保存在名为 [.gitignore] [4] 的文件中;

Image

Image

  • 执行上述操作后,[venv]文件夹中的所有文件都将从未版本化文件列表中消失。只剩下刚刚创建的[.gitignore]文件
  • [5] 中,我们选中它以便保存;
  • [6] 中,创建提交信息:
  • [7] 中,我们提交。此时系统会为项目拍摄一张快照;

Image

  • [8-9] 中,[.gitignore] 文件的内容:仅有一行,包含文件夹 [/venv] 的名称,这表明在照片中应忽略该文件夹的内容;

现在让我们看看 Git 能为我们做些什么。首先,我们创建一个名为 [git] 的文件夹(您可以使用任何其他名称——演示结束后可以将其删除):

Image

  • [1-5] 中,创建一个名为 [git] 的文件夹;

Image

  • [6-10] 目录下,创建一个名为 [git_01] 的 Python 脚本;

Image

  • [11-12] 中,脚本仅包含一条注释;
  • [13-14] 中,创建 [git_01] 的副本。 为此,请选中 [git_01],按 Ctrl-C(复制),然后按 Ctrl-V(粘贴),并将文件名指定为 [git_02]

Image

现在,让我们提交项目。系统将使用这两个文件 [git_01, git_02] 生成一张图片;

Image

  • 合并为 [1-3],提交项目;
  • 生成 [4],选择要提交的未版本化文件(此处为全部);
  • [5] 中,输入提交说明;
  • [6] 中,执行提交;

Image

  • [1-2] 中,确认提交;
  • [3] 中,选择标签页 [Log]
  • [4] 中,显示项目分支视图。此处仅有一个名为 [master] 的分支;
  • [5-6] 中,显示刚刚执行的提交;

现在,我们以同样的方式创建一个名为 [git_03] 的脚本:

Image

修改脚本 [git_02] 并删除脚本 [git_01]

Image

然后提交新版本:

Image

现在日志中有两个提交:

Image

当选中某个特定的提交时,其右侧会显示项目的文件树:

Image

现在假设最后一次提交导致了死胡同,我们希望回退到与之前某次提交对应的状态:

Image

  • [1-2] 中,选择希望回退到的提交;
  • [3-5] 中,有多种重置模式。我们选择 [hard] 模式,该模式将回退到所选状态,同时丢弃此后所做的更改;

Image

  • [6] 中,我们恢复了之前被删除的 [git_01]
  • [7-8] 中,[git_02] 恢复为原始状态,且不包含之前所做的修改;

现在,我们修改 [git_02],并添加 [git_03][1-4]

Image

现在,让我们重新执行回退到初始提交的操作:

Image

  • [1-4] 中,我们回到了第 1 个提交的照片;
  • [5-6] 中,我们选择 [Keep] 而不是 [Hard]。这些选项并不容易理解。因此需要亲自尝试:
  • [1] 中,文件 [git_03] 依然存在;
  • [2-3] 中,[git_02] 文件保留了其修改内容;

很难说这个 [Revert Commit] 做了什么。现在将当前情况提交:

Image

  • [1-6] 中,提交;

Image

  • [9] 中,可以看到新的提交;

现在,让我们尝试回退到提交 1,就像之前做过的那样:

  • [1-6] 中,我们回到了提交 1,模式为 [Hard]

Image

  • [7-8] 中,这次确实丢失了自第 1 个提交以来所做的所有修改;

接下来,我们将不再提及 [Git]。读者可以按以下方式操作:

  • 可以按照给出的示例操作,既可以自己输入代码,也可以从课程网站上获取;
  • 每当一个示例运行成功时,即可提交项目;
  • 当编写自己的代码遇到瓶颈时,可知通过回滚到之前的提交,即可恢复到稳定状态;

2.3. Python 代码编写规范

即使不遵循编写规范,Python 代码依然可以运行。 但这可能不被制定了编写规范的 Python 社区所认可。这些规范总结在一篇博文中,地址为 |https://stackoverflow.com/questions/159720/what-is-the-naming-convention-in-python-for-variable-and-function-names|:

Image

  • 模块名称(module_name)遵循一种有时被称为 [snake_case] 的规范:全部小写,单词之间可使用下划线分隔。 该 [snake_case] 规范适用于方法、包、变量和函数的命名;
  • 类名(ClassName)遵循一种有时被称为 [PascalCase] 的命名规范:由多个单词连写而成,每个单词的首字母大写;
  • 常量名称遵循 [SNAKE_CASE] 规范:由大写单词组成,各单词之间用下划线分隔;

本文档总体上遵循了这些命名约定。不过,对于定义类的模块,我将其名称设为与所包含的类名称相同。因此,它遵循的是 [PascalCase] 约定,而非 [snake_case]。这样做是为了便于快速识别类模块。