最初是谁发明了这种语法:-*- coding: utf-8 -*-

175

Python将以下内容识别为指令,用于定义文件的编码:

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

我肯定以前见过这种指令 (-*- var: value -*-),所以我认为 Python 并不是发明它们的人,也不是唯一使用这种指令的人。

这个语法来自哪里?有完整的规范吗?例如,值是否可以包含空格、特殊符号、换行符,甚至是 -*- 本身?

还有哪些软件识别这样的元数据语法?

我的程序将写入纯文本文件,我想使用这种格式在其中包含一些元数据。


5
这个更容易记住并且在我的编辑器PyCharm中可用。 # 编码:utf-8 - crizCraig
3
在Python 2.7中,使用# coding: utf8可以直接工作,即使不在PyCharm中也是如此(我使用SublimeText)。需要翻译的内容已经完成。 - Basj
2
@Cbhihe 这个问题不是关于Python的,也不是关于指令的作用或工作原理。它询问的是在Python出现之前哪个软件发明了它,以及除了文件编码之外是否还有其他内容。 - hamstergene
4个回答

107

5
根据Emacs手册,我可以得出结论:value可以是任何LISP表达式,特别是一段用双引号括起来的字符串。 - hamstergene
感谢Pep链接。我以前认为该指令只能由文本编辑器使用。直到现在,我才知道如果文件的前两行中有注释,Python解释器实际上会解析该注释。 - umeboshi
这个确切的语句来自Python,但一般的格式是Emacs的一种东西,正如Python文档本身在https://docs.python.org/3/howto/unicode.html#unicode-literals-in-python-source-code中所说:“这种语法受到Emacs为文件指定局部变量的表示法的启发。” - calestyo

62

# -*- coding: utf-8 -*- 是 Python 2 的东西。

在 Python 3.0+ 中,源文件的默认编码 已经是 UTF-8,因此您可以安全地删除该行,因为除非它说的是除 一些变体 外的其他内容,否则它没有任何效果。请参见我应该在 Python 3 中使用编码声明吗?


pyupgrade是一个工具,可以运行在你的代码上,用于删除那些Python 2中无用的注释和其他剩余部分,例如让所有类都继承自object


11

这是所谓的文件本地变量,在Emacs中可以理解并相应设置。请参见Emacs手册中相应的部分,您可以在文件头或尾中定义它们。


1
这种特定类型的文件本地变量不仅被文本编辑器所理解,Python 解释器本身也能够理解。https://dev59.com/8lgR5IYBdhLWcg3wJqe6 - user3064538

4
在PyCharm中,我会将其删除。这将关闭底部的UTF-8指示器,并显示硬编码的编码警告。不认为您需要上述提到的PyCharm注释。

实际上,如果我添加了一行代码 test1 = 'äöü',它会提示你在文件中添加这样的头文件。(PyCharm 2019.1) - Cutton Eye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接