PEP 263 definiuje sposób deklarowania kodowania kodu źródłowego w Pythonie.
Zwykle pierwsze 2 wiersze pliku Pythona powinny zaczynać się od:
#!/usr/bin/python
# -*- coding: <encoding name> -*-
Ale widziałem wiele plików zaczynających się od:
#!/usr/bin/python
# -*- encoding: <encoding name> -*-
=> kodowanie zamiast kodowania .
Jaki jest więc prawidłowy sposób deklarowania kodowania pliku?
Czy kodowanie jest dozwolone, ponieważ używane wyrażenie regularne jest leniwe? Czy jest to po prostu kolejna forma deklarowania kodowania pliku?
Zadaję to pytanie, ponieważ PEP nie mówi o kodowaniu , po prostu mówi o kodowaniu .
#!/usr/bin/env python
zamiast#!/usr/bin/python
ascii
naUTF-8
. Porównaj: dokumentacja Pythona 2.7 z dokumentacją Pythona 3.7 . Oznacza to, że możesz bezpiecznie pominąć to kodowanie, jeśli chcesz to określićUTF-8
.Odpowiedzi:
Sprawdź dokumenty tutaj :
„Jeśli komentarz w pierwszej lub drugiej linii skryptu Pythona pasuje do wyrażenia regularnego
coding[=:]\s*([-\w.]+)
, komentarz ten jest przetwarzany jako deklaracja kodowania”„Zalecane formy tego wyrażenia to
który jest rozpoznawany również przez GNU Emacs i
który jest rozpoznawany przez VIM Brama Moolenaara. "
Możesz więc umieścić prawie wszystko przed częścią „kodowanie”, ale trzymaj się „kodowania” (bez przedrostka), jeśli chcesz być w 100% zgodny z zaleceniami python-docs.
Mówiąc dokładniej, musisz użyć wszystkiego, co jest rozpoznawane przez Python i określone oprogramowanie do edycji, z którego korzystasz (jeśli w ogóle coś potrzebuje / akceptuje). Np.
coding
Forma jest rozpoznawana (po wyjęciu z pudełka) przez GNU Emacsa, ale nie przez Vima (tak, bez powszechnej zgody, jest to zasadniczo wojna o wpływy ).źródło
-*-
?-*-
gwarantuje, że linia jest rozpoznawane przez GNU Emacs (edytora tekstu popularnej w niektórych programistów). Zauważ, że w przeciwieństwie do tej odpowiedzi, zarówno formularz Emacsa, jak i formularz Vima są w 100% kompatybilne z rekomendacjami python-docs (ponieważ oba pasują do wyrażenia regularnego - "dopasuj", zgodnie z długotrwałą konwencją, oznacza "dopasuj w dowolnym miejscu w string ”, w przeciwieństwie do API Pythona).<prefix>-*- var: value[; ...] -*-
.PEP 263:
Zatem „en coding: UTF-8 ” pasuje.
PEP podaje kilka przykładów:
źródło
Po prostu skopiuj poniższą instrukcję wklej w górnej części programu, aby rozwiązać problemy z kodowaniem znaków
źródło
Stan na dzień dzisiejszy - czerwiec 2018 r
PEP 263 sam wspomina wyrażenie regularne, które następuje:
Tak więc, jak już podsumowano w innych odpowiedziach, będzie pasować
coding
do dowolnego przedrostka, ale jeśli chcesz być tak zgodny z PEP, jak to tylko możliwe (nawet jeśli, o ile wiem, używanieencoding
zamiastcoding
nie narusza PEP 263 w jakikolwiek sposób) - trzymaj się „zwykłego”coding
, bez przedrostków.źródło
Jeśli się nie mylę, oryginalna propozycja kodowania plików źródłowych polegała na użyciu wyrażenia regularnego w pierwszych kilku wierszach, co pozwoliłoby na jedno i drugie.
Myślę, że wyrażenie regularne było czymś w rodzaju,
coding:
po którym następuje coś.Znalazłem to: http://www.python.org/dev/peps/pep-0263/ Co jest oryginalną propozycją, ale nie mogę znaleźć ostatecznej specyfikacji określającej dokładnie, co zrobili.
Z pewnością przywykłem
encoding:
do świetnego efektu, więc oczywiście to działa.Spróbuj zmienić na coś zupełnie innego, na przykład
duhcoding: ...
sprawdź, czy to działa równie dobrze.źródło
Podejrzewam, że jest podobny do Rubiego - każda metoda jest w porządku.
Dzieje się tak głównie dlatego, że różne edytory tekstu używają różnych metod (tj. Tych dwóch) oznaczania kodowania.
W Rubim, o ile pierwsza lub druga, jeśli istnieje linia shebang, zawiera ciąg pasujący:
i ignorując wszelkie spacje i inne kłaczki w tych wierszach. (Często może to być również = zamiast:).
źródło