Cara yang benar untuk mendefinisikan pengkodean kode sumber Python


163

PEP 263 mendefinisikan cara mendeklarasikan pengkodean kode sumber Python.

Biasanya, 2 baris pertama file Python harus dimulai dengan:

#!/usr/bin/python
# -*- coding: <encoding name> -*-

Tetapi saya telah melihat banyak file dimulai dengan:

#!/usr/bin/python
# -*- encoding: <encoding name> -*-

=> encoding daripada coding .

Jadi apa cara yang benar untuk mendeklarasikan penyandian file?

Apakah penyandian diizinkan karena regex yang digunakan malas? Atau itu hanya bentuk lain dari mendeklarasikan penyandian file?

Saya mengajukan pertanyaan ini karena PEP tidak berbicara tentang pengkodean , itu hanya berbicara tentang pengkodean .


4
Ngomong-ngomong, untuk fleksibilitas dan portabilitas yang lebih tinggi, disarankan untuk menggunakan #!/usr/bin/env pythonbukannya#!/usr/bin/python
glarrain

7
Saya suka cara tidak ada jawaban di halaman ini yang memiliki contoh sederhana yang berfungsi untuk mengatakan UTF8. StackOverly yang terbaik.
aaa90210

2
Saya hanya ingin menambahkan bahwa Python 3 telah mengubah penyandian default dari asciimenjadi UTF-8. Bandingkan: python 2.7 docs dengan python 3.7 docs . Ini berarti Anda dapat dengan aman menghilangkan pengkodean ini jika Anda ingin menentukan UTF-8.
gertvdijk

Jawaban:


161

Periksa dokumen di sini :

"Jika komentar di baris pertama atau kedua skrip Python cocok dengan ekspresi reguler coding[=:]\s*([-\w.]+), komentar ini diproses sebagai deklarasi penyandian"

"Bentuk yang disarankan dari ungkapan ini adalah

# -*- coding: <encoding-name> -*-

yang diakui juga oleh GNU Emacs, dan

# vim:fileencoding=<encoding-name>

yang diakui oleh VIM Bram Moolenaar. "

Jadi, Anda bisa meletakkan apa saja sebelum bagian "coding", tetapi tetaplah pada "coding" (tanpa awalan) jika Anda ingin 100% python-docs-recommendation-compatible.

Lebih khusus lagi, Anda perlu menggunakan apa pun yang dikenali oleh Python dan perangkat lunak pengeditan khusus yang Anda gunakan (jika perlu / menerima apa saja). Misalnya codingformulir dikenali (di luar kotak) oleh GNU Emacs tetapi bukan Vim (ya, tanpa perjanjian universal, itu pada dasarnya perang wilayah ).


10
Mengapa -*-?
Iulian Onofrei

10
The -*-memastikan bahwa baris dikenali oleh GNU Emacs (editor teks populer dengan beberapa programmer). Perhatikan bahwa, bertentangan dengan jawaban ini, baik formulir Emacs dan formulir Vim 100% kompatibel dengan python-docs-rekomendasi (karena keduanya cocok dengan regexp - "kecocokan", dengan konvensi lama, berarti "kecocokan di mana saja di string ", bertentangan dengan API Python).
martinjs

1
Persyaratan khusus Emacs untuk arahan tertanam didokumentasikan di gnu.org/software/emacs/manual/html_node/emacs/… . Secara singkat, format untuk awal file adalah: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev

38

PEP 263:

baris pertama atau kedua harus cocok dengan ekspresi reguler "coding [: =] \ s * ([- \ w.] +)"

Jadi, "en coding: UTF-8 " cocok.

PEP memberikan beberapa contoh:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> :

 

# This Python file uses the following encoding: utf-8
import os, sys

31

Cukup salin tempel pernyataan di bawah ini di bagian atas program Anda. Ini akan menyelesaikan masalah pengkodean karakter

#!/usr/bin/env python
# -*- coding: utf-8 -*-

3

Mulai hari ini - Juni 2018


PEP 263 sendiri menyebutkan regex yang mengikuti:

Untuk menentukan pengkodean kode sumber, komentar ajaib harus ditempatkan ke file sumber baik sebagai baris pertama atau kedua dalam file, seperti:

# coding=<encoding name>

atau (menggunakan format yang dikenali oleh editor populer):

#!/usr/bin/python
# -*- coding: <encoding name> -*-

atau:

#!/usr/bin/python
# vim: set fileencoding=<encoding name> : 

Lebih tepatnya, baris pertama atau kedua harus cocok dengan ekspresi reguler berikut:

^[ \t\f]*#.*?coding[:=][ \t]*([-_.a-zA-Z0-9]+)

Jadi, seperti yang telah dirangkum dengan jawaban lain, itu akan cocok codingdengan awalan apa pun, tetapi jika Anda ingin menjadi sesuai dengan PEP karena mendapat (meskipun, sejauh yang saya tahu, menggunakan encodingbukannya codingtidak melanggar PEP 263 dengan cara apa pun) - tetap dengan 'polos' coding, tanpa awalan.


1

Jika saya tidak salah, proposal asli untuk penyandian file sumber adalah menggunakan ekspresi reguler untuk beberapa baris pertama, yang akan memungkinkan keduanya.

Saya pikir regex adalah sesuatu yang coding:diikuti oleh sesuatu.

Saya menemukan ini: http://www.python.org/dev/peps/pep-0263/ Yang merupakan proposal asli, tetapi sepertinya saya tidak dapat menemukan spek akhir yang menyatakan dengan tepat apa yang mereka lakukan.

Saya sudah terbiasa encoding:dengan efek yang hebat, jadi jelas itu berhasil.

Coba ubah ke sesuatu yang sama sekali berbeda, ingin duhcoding: ...melihat apakah itu berfungsi dengan baik.


0

Saya menduga itu mirip dengan Ruby - metode mana pun tidak apa-apa.

Ini sebagian besar karena editor teks yang berbeda menggunakan metode yang berbeda (yaitu, dua) pengkodean penandaan.

Dengan Ruby, selama yang pertama, atau kedua jika ada garis shebang berisi string yang cocok:

coding: encoding-name

dan mengabaikan spasi putih dan bulu-bulu lain di jalur itu. (Ini sering bisa menjadi = bukannya:, juga).

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.