跳到内容

未指定编码 (PLW1514)

源自 Pylint 代码检查工具。

修复总是可用的。

此规则不稳定且处于预览状态。使用需要 --preview 标志。

作用

检查在 open 和相关调用中是否使用了缺少显式 encoding 参数的情况。

为什么这不好?

在文本模式下使用 open 而没有显式指定编码可能会导致代码不可移植,在不同平台上行为不同。虽然读者可能认为 UTF-8 是默认编码,但实际上,默认编码是特定于语言环境的。

相反,考虑使用 encoding 参数来强制使用特定的编码。 PEP 597 建议使用 encoding="utf-8" 作为默认值,并建议它可能在未来版本的 Python 中成为默认值。

如果需要使用特定于语言环境的编码,请在 Python 3.10 及更高版本中使用 encoding="locale",或在更早版本中使用 locale.getpreferredencoding(),以使编码显式。

修复安全性

此修复始终是不安全的,可能会更改程序的行为。它强制 encoding="utf-8" 作为默认值,而不管平台的实际默认编码如何,这可能会在非 UTF-8 系统上导致 UnicodeDecodeError

with open("test.txt") as f:
    print(f.read()) # before fix (on UTF-8 systems): 你好,世界!
with open("test.txt", encoding="utf-8") as f:
    print(f.read()) # after fix (on Windows): UnicodeDecodeError

示例

open("file.txt")

建议改为

open("file.txt", encoding="utf-8")

参考