Czy powinienem używać deklaracji kodowania w Pythonie 3?

114

Python 3 domyślnie używa kodowania UTF-8 dla plików kodu źródłowego. Czy nadal powinienem używać deklaracji kodowania na początku każdego pliku źródłowego? Lubić# -*- coding: utf-8 -*-

Mateusz Jagiełło
źródło

Odpowiedzi:

112

Ponieważ wartością domyślną jest UTF-8, musisz użyć tej deklaracji tylko wtedy, gdy odejdziesz od wartości domyślnej lub jeśli polegasz na innych narzędziach (takich jak IDE lub edytor tekstu), aby wykorzystać te informacje.

Innymi słowy, jeśli chodzi o Pythona , tylko wtedy, gdy chcesz użyć innego kodowania, musisz użyć tej deklaracji.

Inne narzędzia, takie jak Twój edytor, mogą obsługiwać podobną składnię, dlatego specyfikacja PEP 263 pozwala na znaczną elastyczność w składni (musi to być komentarz, codingmusi tam być tekst , po którym następuje znak :lub =i opcjonalna spacja, po którym następuje rozpoznany kodek).

Zauważ, że dotyczy to tylko sposobu, w jaki Python odczytuje kod źródłowy . Nie dotyczy wykonywania tego kodu, a więc nie dotyczy sposobu, w jaki drukowanie, otwieranie plików lub inne operacje we / wy są tłumaczone między bajtami a Unicode. Aby uzyskać więcej informacji na temat Pythona, Unicode i kodowania, gorąco zachęcam do przeczytania Python Unicode HOWTO lub bardzo dokładnej rozmowy Pragmatic Unicode autorstwa Neda Batcheldera.

Martijn Pieters
źródło
28
W # -*- coding: utf-8 -*-przypadku niektórych edytorów może być nadal przydatna do przełączenia się na oczekiwane kodowanie podczas edycji pliku źródłowego.
PEPR
1
@pepr A Byte Order Mark może zrobić to samo, prawda?
endolith
12
@endolith: BOM UTF-8 jest obrzydliwością na tej ziemi stworzoną przez firmę Microsoft .. Zobacz en.wikipedia.org/wiki/Byte_order_mark#UTF-8
Martijn Pieters
1
@MartijnPieters Twój link nie zgadza się z Tobą
endolith
2
@endolith: nie, artykuł WP tylko podsumowuje tło, uważam, że to obrzydliwość. Celem BOM jest zapisanie kolejności bajtów (stąd nazwa, Byte Order Mark). Nie ma pomyłki w kolejności bajtów w UTF-8, ma tę funkcję tylko w UTF-16 i UTF-32. Wartość jest już ponownie zastosowanym znakiem spacji bez przerwy o zerowej szerokości (przydatne, ponieważ przypadkowe drukowanie kończy się wtedy całkowicie niewidocznym wynikiem), ponowne użycie tego jako magicznej stałej jest moim zdaniem niewłaściwe.
Martijn Pieters
6

Nie, jeśli:

  • cały projekt używa tylko UTF-8, co jest wartością domyślną.
  • i masz pewność, że narzędzie IDE nie potrzebuje tej deklaracji kodowania w każdym pliku.

Tak jeśli

  • Twój projekt opiera się na innym kodowaniu
  • lub opiera się na wielu kodowaniach.

W przypadku projektów z wieloma kodowaniami:

Jeśli niektóre pliki są zakodowane w formacie non-utf-8, to nawet dla tych zakodowanych w formacie UTF-8należy również dodać deklarację kodowania, ponieważ złotą zasadą jestExplicit is better than implicit.

Odniesienie:

  • PyCharm nie potrzebuje tej deklaracji:

konfigurowanie kodowania dla konkretnego pliku w pycharm

  • vim nie potrzebuje tej deklaracji, ale:
# vim: set fileencoding=<encoding name> :
Sławomir Lenart
źródło