是'# - * - 编码:utf-8 - * - '也是Python的评论?

时间:2017-01-16 16:10:32

标签: python encoding comments

当我们使用#在Python中插入注释时,Python如何采用:

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

不同?

2 个答案:

答案 0 :(得分:44)

是的,这也是一个评论。 该评论的内容如果位于文件的顶部,则在前两行中具有特殊含义。

来自Encoding declarations documentation

  

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

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

鉴于注释必须是文件中的第一行或第二行(如果它是第二行,第一行也必须是注释),这是完全安全的,因为配置的编解码器只能制作无论如何,与非评论行不同。

答案 1 :(得分:17)

参见Python参考手册中的encoding declarations

  

如果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