Skąd się to bierze: - * - kodowanie: utf-8 - * -

135

Python rozpoznaje następującą instrukcję, która definiuje kodowanie pliku:

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

Zdecydowanie widziałem tego rodzaju instrukcje wcześniej ( -*- var: value -*-). Skąd to pochodzi? Jaka jest pełna specyfikacja, np. Czy wartość może zawierać spacje, symbole specjalne, znaki nowej linii, a nawet -*-samą siebie?

Mój program będzie zapisywał zwykłe pliki tekstowe i chciałbym dołączyć do nich metadane przy użyciu tego formatu.

hamstergen
źródło
3
Jest to łatwiejsze do zapamiętania i działa w moim edytorze PyCharm. # coding: utf-8
crizCraig
2
Używanie # coding: utf8działa po wyjęciu z pudełka w Pythonie 2.7, nawet poza PyCharm. (Używam SublimeText).
Basj
1
@Cbhihe To pytanie nie dotyczy Pythona, nie dotyczy tego, co robi instrukcja ani jak działa. Pyta, które oprogramowanie pre-Python go wymyśliło i czy chodzi o coś więcej niż tylko kodowanie plików.
hamstergene

Odpowiedzi:

89

Ten sposób określania kodowania pliku w języku Python pochodzi z dokumentu PEP 0263 - Definiowanie kodowania kodu źródłowego w języku Python .

Jest również rozpoznawany przez GNU Emacs (patrz Python Language Reference, 2.1.4 Encoding Declarations ), chociaż nie wiem, czy był to pierwszy program, który używał tej składni.

Andrea Spadaccini
źródło
4
Z tego co mogę wywnioskować z podręcznika Emacs, wartość może być dowolne wyrażenie LISP, szczególnie, podwójnie cudzysłowie
hamstergene
Dzięki za link zachęcający. Wcześniej miałem wrażenie, że z dyrektywy korzystał tylko redaktor tekstu. Do tej pory nigdy nie wiedziałem, że interpreter Pythona faktycznie przeanalizował komentarz, jeśli znajduje się on w pierwszych dwóch wierszach pliku.
umeboshi
8

Są to tak zwane zmienne plikowe, które są rozumiane przez Emacsa i odpowiednio ustawiane. Zobacz odpowiednią sekcję w podręczniku do Emacsa - możesz je zdefiniować w nagłówku lub w stopce pliku

Alex Ott
źródło
Ten specyficzny typ zmiennej lokalnej pliku jest również rozumiany przez sam interpreter języka Python, nie dotyczy to tylko edytorów tekstu. stackoverflow.com/questions/41680533/…
Boris
4

W PyCharm opuściłbym to. Wyłącza wskaźnik UTF-8 na dole z ostrzeżeniem, że kodowanie jest zakodowane na stałe. Nie myśl, że potrzebujesz wspomnianego powyżej komentarza PyCharm.

cwp393
źródło
właściwie, jeśli wstawię taką linię, test1 = 'äöü'to podpowie ci, aby dodać taki nagłówek do pliku. (pycharm 2019.1)
Cutton Eye
@Cutton Eye czy tak jest z Pythonem 2 czy 3?
Boris