ChatGPT解决这个技术问题 Extra ChatGPT

Where does this come from: -*- coding: utf-8 -*-

Python recognizes the following as instruction which defines file's encoding:

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

I definitely saw this kind of instructions before (-*- var: value -*-). Where does it come from? What is the full specification, e.g. can the value include spaces, special symbols, newlines, even -*- itself?

My program will be writing plain text files and I'd like to include some metadata in them using this format.

This is easier to remember and works in my editor, PyCharm. # coding: utf-8
Using # coding: utf8 works out of the box with Python 2.7, even outside of PyCharm. (I use SublimeText).
@Cbhihe This question is not about Python, not about what the instruction does or how it works. It is asking which pre-Python software invented it and if there is more to it than just file encoding.

A
Andrea Spadaccini

This way of specifying the encoding of a Python file comes from PEP 0263 - Defining Python Source Code Encodings.

It is also recognized by GNU Emacs (see Python Language Reference, 2.1.4 Encoding declarations), though I don't know if it was the first program to use that syntax.


From what I can conclude from Emacs manual, value can be any LISP expression, particularly, a double-quoted string
Thanks for the pep link. I was formerly under the impression that the directive was only used by the text editor. Until now, I never knew that the python interpreter actually parsed the comment if it is present on the first two lines of the file.
B
Boris Verkhovskiy

# -*- coding: utf-8 -*- is a Python 2 thing.

In Python 3.0+ the default encoding of source files is already UTF-8 so you can safely delete that line, because unless it says something other than some variation of "utf-8", it has no effect. See Should I use encoding declaration in Python 3?

pyupgrade is a tool you can run on your code to remove those comments and other useless leftovers from Python 2, like having all your classes inherit from object.


A
Alex Ott

This is so called file local variables, that are understood by Emacs and set correspondingly. See corresponding section in Emacs manual - you can define them either in header or in footer of file


This specific type of file local variable is also understood by the Python interpreter itself, it's not just for text editors. stackoverflow.com/questions/41680533/…
c
cwp393

In PyCharm, I'd leave it out. It turns off the UTF-8 indicator at the bottom with a warning that the encoding is hard-coded. Don't think you need the PyCharm comment mentioned above.


actually, if I put a line like test1 = 'äöü' it will hint you to add such a headder to the file. (pycharm 2019.1)