补注喵
for Proj-03
一些工具的介绍
让GPT-4o做了张表,可以看看对比
特性 | Pylance | Pylint | Mypy | Flake8 |
---|---|---|---|---|
主要功能 | 提供智能代码补全、类型检查和错误检测 | 静态代码分析,检测代码中的潜在问题 | 类型检查,确保代码符合类型提示 | 静态代码分析,检测代码中的样式和潜在问题 |
集成开发环境 | VSCode | 独立工具,但与各种 IDE 兼容 | 独立工具,但与各种 IDE 兼容 | 独立工具,但与各种 IDE 兼容 |
类型检查 | 是 | 部分支持(主要通过推断类型) | 是 | 否 |
代码样式检查 | 否 | 是 | 否 | 是 |
配置难易度 | 简单(主要通过 VSCode 设置) | 中等(通过配置文件进行详细配置) | 简单(通过配置文件进行详细配置) | 简单(通过配置文件进行详细配置) |
错误报告详细程度 | 高 | 高 | 中等 | 中等 |
性能 | 高(由于其基于静态分析和类型推断) | 中等(进行详细的静态分析,可能较慢) | 高(主要进行类型检查,性能较好) | 高(主要进行样式检查,性能较好) |
主要用途 | 提高开发效率,减少错误 | 提高代码质量,减少潜在问题 | 确保类型正确性,减少类型相关错误 | 提高代码质量,确保符合编码规范 |
扩展性 | 通过插件扩展功能 | 通过插件和自定义规则扩展功能 | 主要功能集中在类型检查 | 通过插件和自定义规则扩展功能 |
社区支持 | 强(由于与 VSCode 集成,社区用户多) | 强(长期以来受到广泛使用) | 强(逐渐普及,社区支持逐渐增加) | 强(广泛使用,社区支持多) |
以下的则是我写的,说法也不一定准确就是了。
Black
Black on PyPI,以及它的在线演示网站
本身是个命令行工具,但是在 VSCode 扩展 Black Formatter
中有搭载,能够即装即用。
相当「固执」的代码格式化工具,仅提供那么几个配置选项。
在一段代码前加上注释 # fmt: off
,后加上 # fmt: on
,可以让 black
不格式化这段代码。包含 # fmt: skip
的单行也不会被格式化。更多使用方法参见 Black 的使用文档。
black
的格式化可能不会完全满足别的风格检查工具的要求
Flake8
同样是一个命令行工具,但在 VSCode 扩展 Flake8
中也有搭载,能够即装即用。
速度超快的风格检查工具。
在代码中使用注释 # noqa
或 # noqa: <具体条目>
来禁用某行的全部或某些风格检查(以逗号分隔)。或者在某个程序文件中包含 # flake8: noqa
来禁用此文件内的所有检查。
例如:
# noqa: F401,E234
更多信息参见 Flake8 的使用文档
noqa = NO-QA (NO Quality Assurance)
Pylint
仍然是一个命令行工具,但在 VSCode 扩展 Pylint
中有搭载,能够即装即用。
速度稍慢的静态分析工具,包含风格检查。
在参数中添加 --disable=<具体条目或类型>
来禁用某些检查(以逗号分隔)。
也可以使用注释 # pylint: disable=<具体条目或类型>
,可以位于单行或文件顶部。也可以像 Black
那样用 enable
和 disable
包括一个代码片段。
可在 Pylint 的官方文档中查阅所有条目。
例如:
--disable=C,R,line-too-long,W4903
Mypy
是命令行工具。在 VSCode 扩展 Mypy Type Checker
中有搭载。另一个可用的替代扩展 Mypy
中没有搭载,如果使用则需要安装。
强大的类型检查工具。
可在 Mypy 的官方文档中查阅更多信息。
isort
是命令行工具。且在 VSCode 扩展 isort
中有搭载。
import 语句顺序检查与自动排序工具。
在模块的 docstring 里加上 isort:skip_file
以忽略整个文件,使用注释 # isort:skip
以忽略一整行。
更多信息参见 isort 的官方文档
可能与 Black
冲突,解决方法参考官方文档,或者只用它们的其中一个
关于 colorama
库
这是一个跨平台的终端文字着色库,用起来挺简单的。去 PyPI 看看?
关于音乐的元数据
元数据 metadata
是描述数据的数据。那么音乐的元数据就是描述音乐的信息、特征的数据,像采样率、位深度、比特率、标题、作曲家、专辑、流派、音轨号等等。有很多人为赋予它的信息需要额外地存储到音频文件中,就产生了音频文件标签 tag
。类似地,其他地方也有类似的用来存放此类信息的机制。参见 Tag (metadata)。
在 Exif Tools 这个网站上可以进行一些简单的字段的查阅,此外借助搜索引擎也能找到很多内容。比如 ID3 格式的标签也可以参见 ID3 on Wiki。
正文中提到了mutagen
tinytag
等 Python 库,它们能够读取音频文件标签。此外还有一些通用的命令行工具也可以,比如ffprobe
。
网络相关
给我去读 MDN Docs
迭代器
迭代器使用 __next__()
方法(对于外界则是 next(iterator)
)来得到下一个元素,并使用 StopIteration
异常来表示迭代终止,可以用 for
来自动提取元素。
对于一个标准的迭代器类,至少需要实现 __next__()
方法和 __iter__()
方法来组成迭代器协议,像这样。
class MyIterator:
def __init__(self, data):
self.data = data
self.index = 0
def __iter__(self):
return self
def __next__(self):
if self.index < len(self.data):
result = self.data[self.index]
self.index += 1
return result
else:
raise StopIteration
2
3
4
5
6
7
8
9
10
11
12
13
14
15
或者用内置函数 iter()
来从一个可迭代对象创建一个迭代器。
更多信息参见 官方文档,以官方文档为准
生成器
生成器是一种特殊的迭代器。在一个函数中使用 yield
来将它变为生成器函数。最简单的一个生成器函数像这样:
# 用于生成斐波那契数列
def fibonacci_generator():
a, b = 0, 1
while True:
yield a
a, b = b, a + b
2
3
4
5
6
此时函数的 return
语句将会引发 StopIteration
异常。跟在 return
后面的值会储存在异常对象的 value
属性中,也可以通过生成器的 close()
方法来得到它。上面的这个例子会无限产生值,对它加以改写得到:
def fibonacci_generator(limit):
a, b = 0, 1
while a < limit:
yield a
a, b = b, a + b
return 'End'
2
3
4
5
6
别忘了函数执行到末尾时还有个默认的
return None
生成器的基本使用方法与迭代器一致,可以直接使用 for
,也可以用循环加上 try ... except StopIteration
。后者可以得到生成器 return
的值。
for i in fibonacci_generator(10):
print(i)
2
此外生成器对象还有一个 close()
方法,能够终止生成器的执行。具体效果是在生成器内部对应的 yield
处引发 GeneratorExit
异常,生成器内部可以捕捉它并做进一步处理。不过这个异常一般不会传递到外界。
在生成器内部可以使用 yield from ...
语句从另一个生成器提取值并产出(转移控制权到另一个生成器),实现简单的生成器嵌套。
此外使用生成器的 send
方法还可以向生成器传递值,在生成器内部这个值将会成为 yield
语句的返回值。这是协程的原始形态。
>>> def generator_with_send():
... value = yield
... print(f'Received: {value}')
... value = yield value * 2
... print(f'Received: {value}')
...
>>> gen = generator_with_send()
>>> next(gen)
>>> gen.send(10)
Received: 10
20
>>> gen.send(20)
Received: 20
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
更多信息参见 官方文档 - yield 表达式,以官方文档为准