Haruskah saya menggunakan deklarasi encoding dengan Python 3?

114

Python 3 menggunakan pengkodean UTF-8 untuk file kode sumber secara default. Apakah saya harus tetap menggunakan deklarasi encoding di awal setiap file sumber? Suka# -*- coding: utf-8 -*-

Mateusz Jagiełło
sumber

Jawaban:

112

Karena defaultnya adalah UTF-8, Anda hanya perlu menggunakan deklarasi itu saat menyimpang dari default, atau jika Anda mengandalkan alat lain (seperti IDE atau editor teks) untuk menggunakan informasi itu.

Dengan kata lain, sejauh menyangkut Python , hanya jika Anda ingin menggunakan encoding yang berbeda, Anda harus menggunakan deklarasi itu.

Alat lain, seperti editor Anda, dapat mendukung sintaks yang serupa, itulah sebabnya spesifikasi PEP 263 memungkinkan fleksibilitas yang cukup besar dalam sintaks (harus berupa komentar, teks codingharus ada, diikuti dengan karakter :atau =dan spasi kosong opsional, diikuti oleh codec yang dikenali).

Perhatikan bahwa ini hanya berlaku untuk cara Python membaca kode sumber . Ini tidak berlaku untuk mengeksekusi kode itu, jadi tidak untuk bagaimana mencetak, membuka file, atau operasi I / O lainnya menerjemahkan antara byte dan Unicode. Untuk detail lebih lanjut tentang Python, Unicode, dan pengkodean, saya sangat mendorong Anda untuk membaca Python Unicode HOWTO , atau pembicaraan Unicode Pragmatis yang sangat menyeluruh oleh Ned Batchelder.

Martijn Pieters
sumber
28
The # -*- coding: utf-8 -*-mungkin masih berguna untuk beberapa editor untuk beralih ke yang diharapkan pengkodean saat mengedit file sumber.
pepr
1
@pepr Sebuah Byte Order Mark bisa melakukan hal yang sama, bukan?
endolith
12
@endolith: UTF-8 BOM adalah kekejian di bumi ini yang dibawa oleh Microsoft .. Lihat en.wikipedia.org/wiki/Byte_order_mark#UTF-8
Martijn Pieters
1
@MartijnPieters Tautan Anda sepertinya tidak setuju dengan Anda
endolith
2
@endolith: tidak, artikel WP hanya merangkum latar belakang, menurut pendapat saya sendiri itu adalah kekejian. Inti dari BOM adalah untuk merekam urutan byte (karena itu namanya, Byte Order Mark). Tidak ada kebingungan urutan byte di UTF-8, hanya memiliki fungsi itu di UTF-16 dan UTF-32. Nilainya sudah menjadi karakter spasi tanpa putus lebar-nol yang dimaksudkan ulang (berguna, karena pencetakan tidak disengaja kemudian berakhir dengan output yang sepenuhnya tidak terlihat), menggunakan kembali itu untuk menjadi konstanta ajaib adalah salah, dalam pandangan saya.
Martijn Pieters
6

Tidak, jika:

  • seluruh proyek hanya menggunakan UTF-8, yang merupakan default.
  • dan Anda yakin alat IDE Anda tidak membutuhkan deklarasi encoding di setiap file.

Ya jika

  • proyek Anda bergantung pada encoding yang berbeda
  • atau mengandalkan banyak pengkodean.

Untuk proyek multi-encoding:

Jika beberapa file dikodekan dalam non-utf-8, bahkan untuk ini dikodekan di UTF-8Anda harus menambahkan deklarasi pengkodean juga, karena aturan emasnya adalahExplicit is better than implicit.

Referensi:

  • PyCharm tidak membutuhkan deklarasi itu:

mengkonfigurasi pengkodean untuk file tertentu di pycharm

  • vim tidak membutuhkan deklarasi itu, tapi:
# vim: set fileencoding=<encoding name> :
Sławomir Lenart
sumber