既然在Python中我们使用#
来插入注释,那么Python如何处理以下内容:
# -*- coding: utf-8 -*-
不同于之前的方式?
是的,这也是一个注释。如果位于文件顶部的前两行中,则该注释的内容具有特殊含义。
根据编码声明文档:
如果 Python 脚本的第一行或第二行中的注释与正则表达式
coding[=:]\s*([-\w.]+)
匹配,则此注释将被处理为编码声明;该表达式的第一组指定了源代码文件的编码方式。编码声明必须单独占一行。如果是第二行,则第一行必须仅包含注释。
请注意,对于注释来说,使用哪种编解码器并不重要。Python 通常会忽略掉 #
标记后的所有内容,在所有可接受的源代码编解码器中,#
、编码声明和行分隔符字符的编码方式完全相同,因为它们都是 ASCII 的超集。所以,解析器只需要读取一行,扫描注释中的特殊文本,必要时再读取一行,扫描注释,然后按照给定的编解码器配置解析器读取数据即可。
既然注释必须是文件中的第一或第二行(如果是第二行,则第一行必须也是注释),这是完全安全的,因为配置的编解码器只会对非注释行产生影响。
# -*- coding: X -*-
而不是 # coding: X
? - Jorge Leitao请参阅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
unknown-encoding
注册为一种编码方式,例如通过.pth
文件,那么该编解码器实际上会被加载和使用。这为预解析代码处理提供了非常好的和有趣的机会。 - Martijn Pieters
-*-
部分是完全可选的,但包含它们似乎是惯例。 文档 表示 "GNU Emacs 也能识别该格式",这表明这可能是它的来源(@tdelaney 所说的文本编辑器的一个例子),但我曾经在从未接触过 Emacs 的代码中看到并使用过它。 - Tim Pederick-*-
样式。这就是我学到它的地方。 - Tim Pederick