当我们#
用于在Python中插入注释时,Python如何采用:
# -*- coding: utf-8 -*-
不同?
是的,这也是一个评论.而该意见的内容进行,如果位于文件的顶部,在头两行特殊的意义.
从编码声明文档:
如果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