编辑器里那三样设置,落地只有三个文件:settings.json 和 pyproject.toml。
检查器管「哪错了」,格式化器管「长什么样」,两件事别混着指望一个工具。
.gitignore 里的 .venv/ 那个斜杠很要紧——它只匹配目录,不匹配同名文件。
这一篇对应教材 0.4 节的后四小节:装 VS Code、用检查器与格式化器、给 VS Code 指定虚拟环境、 写 .gitignore。 教材用的 flake8 加 autopep8,本机用 ruff 一个工具代两者,原理一样。
一、第一件事:让编辑器知道用哪个解释器
VS Code 右下角有个 Python 版本号,点它可以选解释器。
选了 .venv 里那个,插件的补全、跳转、检查才对着正确的依赖。
不选的话它默认用全局解释器——于是你明明装了 Flask,它还是画红线说找不到。
这是新手最常报的假错:代码没错,是编辑器看错了环境。
选完它会在 .vscode/settings.json 里记一行 python.defaultInterpreterPath。
二、第二件事:检查器
检查器(linter)干一件事:不运行代码,只看写法,指出可能的问题。 教材用 flake8。 它查两类东西:一类是逻辑问题(import 了没用、变量未定义),一类是风格问题(行太长、缩进不对)。 本机用 ruff。它是 flake8 的现代替代,用 Rust 写的,快得多,而且一个工具同时管检查和格式化。
配置不写在编辑器里,写在项目根目录的 pyproject.toml——这样换编辑器、进 CI 都认同一份规则。
三、第三件事:格式化器
格式化器(formatter)不改逻辑,只改形状:缩进、空格、换行、引号。 教材用 autopep8。它的原则是「只做最小改动」,所以有时改得不够彻底。 ruff format 更接近 black 的风格:宁可多改几行,也要让所有人写出来一个样。
两件事的分工要清楚:检查器告诉你哪里不对,格式化器直接改成对的形状。 VS Code 里可以设「保存时自动格式化加自动修」,就是把后者挂到保存事件上。
四、第四件事:.gitignore 该写哪几行
教材 0.4.8 节给了一份清单,核心是四类:虚拟环境、缓存、运行期生成的实例目录、密钥文件。
| 要忽略的 | 为什么 |
|---|---|
| .venv/ | 依赖目录,几百兆,谁都能重建 |
| pycache/ | 字节码缓存,Python 自己会生成 |
| *.pyc | 同上,散落在各处的单个文件 |
| instance/ | Flask 放数据库和密钥的地方,跑起来才有 |
| .env | 里面有密钥,绝对不能进仓库 |
.venv/ 后面那个斜杠一定要写。不写的话,一个叫 .venv 的文件也会被忽略;
写了斜杠,只匹配目录。
.env 同理,但它不是目录,所以不加斜杠——它是「密钥文件」,一旦进了仓库,等于把密码贴到公告栏上。
五、动手 Demo:编辑器里的三件套:解释器、检查器、格式化
VS Code 的界面装不了,但检查器、格式化器、.gitignore 这三样都能真跑。 先造一个故意写坏的文件,让 ruff 挑错,再让它改,最后验一遍忽略规则。
# pyproject.toml
[tool.ruff]
line-length = 72
[tool.ruff.lint]
select = ["E", "F"]
# 然后:ruff check bad.py / ruff format --diff bad.py
实跑输出:
--------------------------------------------------------------------
编辑器里的三件套:解释器、检查器、格式化
--------------------------------------------------------------------
教材讲 VS Code 装 Python 插件、选解释器、配 flake8 与 autopep8。
这三样里后两样本质就是「一个查、一个改」,本机用 ruff 一个工具全包了。
[待检查的 bad.py]
| import json
| import os
| import sys
|
|
| def area(w, h):
| s=w*h
| return s
|
|
| print(area(3, 4), sys.argv, "这一行故意写得很长……")
故意写坏:两个没用的 import、等号两边没空格、return 后面两个空格、最后一行超长。
① 检查器怎么说
--------------------------------------------------------------------
ruff check 返回码 1
F401 [*] json imported but unused
--> bad.py:1:8
|
1 | import json
| ^^^^
2 | import os
3 | import sys
|
help: Remove unused import: json
|
- import json
1 | import os
|
F401 [*] os imported but unused
--> bad.py:2:8
|
1 | import json
2 | import os
| ^^
3 | import sys
|
help: Remove unused import: os
|
1 | import json
- import os
2 | import sys
|
E501 Line too long (111 > 72)
--> bad.py:11:52
|
11 | print(area(3, 4), sys.argv, "这一行故意写得很长,用来触发行长检查,
长度必须超过七十二个字符才会被 ruff 抓出来")
| ^^^^^^^^^^^^^^^...
Found 3 errors.
[*] 2 fixable with --fix.
! F401 是「import 了没用」,E501 是「这行太长」。
F 开头是逻辑问题,E 开头是风格问题——VS Code 里画黄线的就是这两类。
② 格式化器怎么说
--------------------------------------------------------------------
--- bad.py
+++ bad.py
@@ -4,8 +4,12 @@
- s=w*h
- return s
+ s = w * h
+ return s
-print(area(3, 4), sys.argv, "这一行故意写得很长,用来触发行长检查,
长度必须超过七十二个字符才会被 ruff 抓出来")
+print(
+ area(3, 4),
+ sys.argv,
+ "这一行故意写得很长,用来触发行长检查,长度必须超过七十二个字符才会被 ruff 抓出来",
+)
! 格式化只改形状,不改逻辑:等号两边补空格、return 后面多余的空格删掉。
教材里的 autopep8 干的是同一件事,ruff format 是它的现代替代。
③ .gitignore:哪些东西不该进仓库
--------------------------------------------------------------------
| 路径 | 结果 | 命中的规则 |
|---|---|---|
| .venv/Lib | 忽略 | .gitignore:1:.venv/ |
| __pycache__/x | 忽略 | .gitignore:2:__pycache__/ |
| a.pyc | 忽略 | .gitignore:3:*.pyc |
| instance/db.sqlite | 忽略 | .gitignore:4:instance/ |
| .env | 忽略 | .gitignore:5:.env |
| static/logo.png | 提交 | — |
| app.py | 提交 | — |
! .venv/ 和 instance/ 后面那个斜杠很要紧:它只匹配目录。
写成 .venv 会连一个叫 .venv 的文件也一起忽略。
instance/ 是 Flask 放数据库和密钥文件的地方,教材第 2 章会用到;
这类「跑起来才生成」的目录,一律不该进仓库。
结论:编辑器里那三样设置,落地就三个东西——解释器路径、检查器规则、格式化开关。
前一个存进 .vscode/settings.json,后两个存进 pyproject.toml。
ruff 报了三条:两条 F401(import 了没用)、一条 E501(行太长,111 超过 72)。
--fix 能自动修掉两条 F401,E501 得人来拆行——自动修只解决机械问题,判断还得人做。
格式化那一段的 diff 是真输出:等号两边补空格、return 后面多余的空格删掉,超长那行被拆成多行。
git check-ignore -v 会告诉你「这条路径是被哪一行规则忽略的」,比盯着 .gitignore 猜快得多。
30 秒实验
- 把
line-length改成 120,重跑 ruff check,看 E501 还在不在。 - 在 .gitignore 里把
.venv/改成.venv, 再用git check-ignore -v看一条叫.venv的文件是否被忽略。 - 给 bad.py 加一行
print(1/0),看 ruff 会不会报——想一想为什么它不报。
常见误区
- 把检查器和格式化器当一回事:一个查、一个改,配错了等于没配。
- 规则写在编辑器设置里:换台电脑就丢,进 CI 也不认;写进 pyproject.toml 才是项目资产。
.gitignore写.venv不带斜杠:会误伤同名文件,虽然少见,但一旦发生很难查。- 把
.env提交上去:密钥泄露最常见的一条路径,没有之一。
自测三问(点开对答案)
1. 检查器和格式化器分别解决什么问题? —— 检查器指出「哪写错了、哪里不规范」,格式化器直接把形状改成统一的,不改逻辑。 2. 为什么 `.venv/` 要带斜杠? —— 斜杠表示只匹配目录。不带斜杠,一个同名的文件也会被忽略。 3. VS Code 里「找不到 flask 模块」的红线,最可能是什么原因? —— 解释器选错了,用的是全局解释器而不是项目虚拟环境里的那个。环境这一章到此结束。 下一章正式动手:从 MVT 讲起,写出第一个能跑的应用,再把路由、模板、表单一样样加上去。
- ☐ (本篇完,下一篇 1.1 MVT 模型:Model、View、Template 各管什么)