“ #-*-code: utf-8-*-”也是 Python 中的注释吗?

当我们使用 #在 Python 中插入注释时,Python 是如何处理的:

# -*- coding: utf-8 -*-

不一样?

113072 次浏览

是的,这也是一个评论。如果评论的内容位于文件的顶部,在前两行,那么它就具有特殊的意义。

来自 < em > 编码声明 文档:

如果 Python 脚本第一行或第二行中的注释与正则表达式 coding[=:]\s*([-\w.]+)匹配,则将该注释作为编码声明处理; 该表达式的第一组命名源代码文件的编码。编码声明必须出现在它自己的一行中。如果是第二行,那么第一行也必须是只能注释的行。

注意,就注释而言,应该使用什么编解码器来读取文件并不重要。Python 通常会在 #令牌之后忽略 一切,并且在所有可接受的源代码编解码器中,#的编码声明和行分隔符字符的编码完全相同,因为它们都是 ASCII 的超集。所以解析器所要做的就是读取一行,扫描注释中的特殊文本,如果需要的话读取另一行,扫描注释,然后配置解析器根据给定的编解码器读取数据。

考虑到注释必须是文件中的第一行或第二行(如果是第二行,第一行也必须是注释) ,这是完全安全的,因为配置的编解码器只能对非注释行起作用。

请参阅 Python 参考手册中的 编码声明:

如果 Python 脚本的 评论 在第一行或第二行与正则表达式 coding[=:]\s*([-\w.]+)匹配,则将该 评论作为编码声明处理; 该表达式的第一组命名源代码文件的编码。

(强调我的)

所以,是的,这是一个评论,一个特别的评论。它的特殊之处在于,解析器将尝试对其进行操作,而不会像对第一行或第二行中的注释那样忽略它。以示例文件 decl.py中的未注册编码声明为例:

# # -*- coding: unknown-encoding -*-
print("foo")

如果你尝试运行它,Python 会尝试处理它,失败并抱怨:

python decl.py
File "decl.py", line 1
SyntaxError: encoding problem: unknown-encoding