正确的方法来定义Python源代码编码

Oli*_*Oli 156 python encoding

PEP 263定义了如何声明Python源代码编码.

通常,Python文件的前两行应该以:

#!/usr/bin/python
# -*- coding: <encoding name> -*-
Run Code Online (Sandbox Code Playgroud)

但我看到很多文件以:

#!/usr/bin/python
# -*- encoding: <encoding name> -*-
Run Code Online (Sandbox Code Playgroud)

=> 编码而不是编码.

那么声明文件编码的正确方法是什么?

是否允许编码,因为使用的正则表达式是懒惰的?或者它只是声明文件编码的另一种形式?

我问这个问题是因为PEP没有谈论编码,它只是谈论编码.

Raf*_*ird 157

查看这里的文档:

"如果Python脚本的第一行或第二行中的coding[=:]\s*([-\w.]+)注释与正则表达式匹配,则此注释将作为编码声明处理"

"这个表达的推荐形式是

# -*- coding: <encoding-name> -*-
Run Code Online (Sandbox Code Playgroud)

这也得到了GNU Emacs的认可,以及

# vim:fileencoding=<encoding-name>
Run Code Online (Sandbox Code Playgroud)

这是Bram Moolenaar的VIM认可的."

所以,你可以在"编码"部分之前添加任何东西,但如果你想要100%python-docs-recommendation兼容,坚持"编码"(没有前缀).

更具体地说,您需要使用Python识别的任何内容以及您使用的特定编辑软件(如果它需要/接受任何内容).例如,coding表格被GNU Emacs识别(开箱即用)但不是Vim(是的,没有普遍协议,它本质上是一场草皮战争).

  • ` - * - `确保该行被GNU Emacs(一些程序员喜欢的文本编辑器)识别.请注意,与此答案相反,Emacs表单和Vim表单都是100%python-docs-recommendation兼容(因为它们都匹配正则表达式 - "匹配",通过长期约定,意味着"匹配任何地方字符串",与Python的API相反). (10认同)
  • 为什么` - * - `? (9认同)

var*_*tec 37

PEP 263:

第一行或第二行必须匹配正则表达式"coding [:=]\s*([ - \w.] +)"

所以," 编码:UTF-8 "匹配.

PEP提供了一些例子:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :
Run Code Online (Sandbox Code Playgroud)

 

# This Python file uses the following encoding: utf-8
import os, sys
Run Code Online (Sandbox Code Playgroud)


Har*_*GUL 29

只需在程序顶部复制粘贴下面的语句.它将解决字符编码问题

#!/usr/bin/env python
# -*- coding: utf-8 -*-
Run Code Online (Sandbox Code Playgroud)


小智 5

截至今天 \xe2\x80\x94 2018 年 6 月

\n\n
\n\n

PEP 263本身提到了它遵循的正则表达式:

\n\n
\n

要定义源代码编码,必须将魔术注释放入源文件中,作为文件的第一行或第二行,例如:

\n\n
# coding=<encoding name>\n
Run Code Online (Sandbox Code Playgroud)\n\n

或(使用流行编辑器识别的格式):

\n\n
#!/usr/bin/python\n# -*- coding: <encoding name> -*-\n
Run Code Online (Sandbox Code Playgroud)\n\n

或者:

\n\n
#!/usr/bin/python\n# vim: set fileencoding=<encoding name> : \n
Run Code Online (Sandbox Code Playgroud)\n\n

更准确地说,第一行或第二行必须匹配以下正则表达式:

\n\n
^[ \\t\\f]*#.*?coding[:=][ \\t]*([-_.a-zA-Z0-9]+)\n
Run Code Online (Sandbox Code Playgroud)\n
\n\n

因此,正如其他答案已经总结的那样,它会coding与任何前缀匹配,但如果您希望尽可能符合 PEP 要求(尽管据我所知,使用encodingcoding不是不以任何方式违反 PEP 263) \xe2\x80\x94 坚持使用 \'plain\' coding,没有前缀。

\n