当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《是'#-*-编码:utf-8-*-'也是Python的评论?》经验,为你挑选了2个好方法。

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

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

不同?



1> Martijn Piet..:

是的,这也是一个评论.该意见的内容进行,如果位于文件的顶部,在头两行特殊的意义.

编码声明文档:

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

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

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


所以真正的问题就变成了:为什么我们使用`# - * - coding:X - * - `而不是`#coding:X`?
@JCLeitão:你不必.*任何与正则表达式*匹配的东西都可以.但是如果您使用Emacs作为编辑器,那么该注释也会通知该编辑器使用哪种编解码器.
@ShravilPotdar:有负载.Unix系统使用的[shebang line](https://en.wikipedia.org/wiki/Shebang_(Unix))和[Windows`py`启动器](https://docs.python.org/) 3/using/windows.html#shebang-lines)将查看相同的信息.如上所述,许多编辑器可以使用注释中的文本进行配置(不仅仅是要使用的编解码器,还有许多其他方面,请参阅[emacs](https://www.gnu.org/software/emacs/manual/html_node) /emacs/Specifying-File-Variables.html)和[vim](http://vimdoc.sourceforge.net/htmldoc/options.html#modeline)docs).可能还有更多.
@RM:不,由于这个原因,不支持多字节编解码器.从[PEP 263](https://www.python.org/dev/peps/pep-0263/):*允许以上述方式处理前两行的任何编码作为源代码编码,包括ASCII兼容编码以及某些多字节编码,如Shift_JIS.它不包括对所有字符使用两个或多个字节的编码,例如UTF-16.这样做的原因是使编码检测算法在令牌化器中保持简单.*

2> Jim Fasaraki..:

请参阅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


但是,如果您将`unkown-encoding`注册为编码,例如,使用`.pth`文件,那么该编解码器实际上已加载并使用.这为预解析代码处理提供了非常好的和有趣的机会.
推荐阅读
小白也坚强_177
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有