Python kaynak kodu kodlamasını tanımlamanın doğru yolu


163

PEP 263 , Python kaynak kodu kodlamasının nasıl bildirileceğini tanımlar.

Normalde, bir Python dosyasının ilk 2 satırı aşağıdakilerle başlamalıdır:

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

Ama ile başlayan birçok dosya gördüm:

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

=> kodlama yerine kodlama .

Peki dosya kodlamasını bildirmenin doğru yolu nedir?

Is kodlayan kullanılan regex tembel olduğu için izin? Yoksa sadece dosya kodlamasını bildirmenin başka bir yolu mu?

Bu soruyu soruyorum çünkü PEP kodlamadan bahsetmiyor , sadece kodlamadan bahsediyor .


4
Bu arada, daha fazla esneklik ve taşınabilirlik için#!/usr/bin/env python#!/usr/bin/python
glarrain

7
Bu sayfadaki cevapların hiçbirinin UTF8 için basit, çalışan bir örneği olmamasını seviyorum. Yavaşça en iyi şekilde.
aaa90210

2
Sadece Python 3'ten kodlayan varsayılan değiştiğini eklemek istedim asciietmek UTF-8. Karşılaştır: python 2.7 dokümanlar ile python 3.7 dokümanlar . Bu, belirtmek isterseniz bu kodlamayı güvenle atlayabileceğiniz anlamına gelir UTF-8.
gertvdijk

Yanıtlar:


161

Dokümanları buradan kontrol edin :

"Python betiğinin birinci veya ikinci satırındaki bir yorum normal ifadeyle eşleşiyorsa coding[=:]\s*([-\w.]+), bu yorum kodlama bildirimi olarak işlenir"

"Bu ifadenin önerilen biçimleri şunlardır:

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

GNU Emacs tarafından da tanınan ve

# vim:fileencoding=<encoding-name>

ve Bram Moolenaar'ın VIM'i tarafından tanındı. "

Yani, "kodlama" kısmından önce hemen hemen her şeyi koyabilirsiniz, ancak% 100 python-docs-öneri uyumlu olmak istiyorsanız "kodlamaya" (önek olmadan) yapışabilirsiniz.

Daha spesifik olarak, Python ve kullandığınız belirli düzenleme yazılımları tarafından tanınan her şeyi kullanmanız gerekir (herhangi bir şeye ihtiyacı varsa / kabul ediyorsa). Örneğin codingform GNU Emacs tarafından (kutudan çıkarılır) tanınır, ancak Vim tarafından değil (evet, evrensel bir anlaşma olmadan, aslında bir çim savaşıdır ).


10
Neden -*-?
Iulian Onofrei

10
-*-Çizgi GNU Emacs (bazı programcılar arasında popüler bir metin editörü) tarafından tanınan olmasını sağlar. Bu cevabın aksine, hem Emacs formunun hem de Vim formunun% 100 python-docs önerisi ile uyumlu olduğunu unutmayın. string ", Python API'sının aksine).
martinjs

1
Gömülü yönergeler için belirli Emacs gereksinimleri gnu.org/software/emacs/manual/html_node/emacs/… adresinde belgelenmiştir . Kısaca, dosyanın başlaması için biçim şöyledir: <prefix>-*- var: value[; ...] -*-.
ivan_pozdeev

38

PEP 263:

birinci veya ikinci satır "kodlama [: =] \ s * ([- \ w.] +)" normal ifadesiyle eşleşmelidir

Böylece, "en kodlama: UTF-8 " eşleşir.

PEP bazı örnekler verir:

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

 

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

31

Programınızın üst kısmındaki aşağıdaki yapıştırıcıyı kopyalamanız yeterlidir. Karakter kodlama sorunlarını çözecektir

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

3

Bugün itibarıyla - Haziran 2018


PEP 263'ün kendisi takip ettiği normalden bahsetmektedir:

Bir kaynak kodu kodlaması tanımlamak için, kaynak dosyalara dosyadaki birinci veya ikinci satır olarak sihirli bir yorum yerleştirilmelidir, örneğin:

# coding=<encoding name>

veya (popüler editörler tarafından tanınan formatları kullanarak):

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

veya:

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

Daha doğrusu, birinci veya ikinci satır aşağıdaki normal ifadeyle eşleşmelidir:

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

Bu nedenle, diğer cevaplarla zaten özetlendiği gibi, codingherhangi bir önekle eşleşir , ancak mümkün olduğunca PEP uyumlu olmak istiyorsanız (söyleyebildiğim kadarıyla encodingyerine kullanmak codingihlal etmiyorsa) PEP 263 herhangi bir şekilde) - codingönek olmadan 'düz' yapıştırın .


1

Yanılmıyorsam, kaynak dosya kodlamaları için orijinal teklif, ilk iki satır için her ikisine de izin veren normal bir ifade kullanmaktı.

Bence normal ifadenin coding:ardından gelen bir şey vardı.

Bunu buldum: http://www.python.org/dev/peps/pep-0263/ Orijinal teklif hangisi, ama tam olarak ne yaptıklarını belirten nihai spesifikasyonu bulamıyorum.

Kesinlikle encoding:büyük bir etkiye alıştım, bu yüzden işe yarıyor.

Tamamen farklı bir şeye geçmeyi deneyin, duhcoding: ...bunun da işe yarayıp yaramadığını görmek gibi.


0

Ruby'ye benzer olduğundan şüpheleniyorum - her iki yöntem de tamam.

Bunun nedeni büyük ölçüde farklı metin editörlerinin işaretleme kodlamasında farklı yöntemler (yani bu ikisi) kullanmasıdır.

Ruby ile, birincisi olduğu sürece veya bir shebang satırı varsa, eşleşen bir dize içerir:

coding: encoding-name

ve bu çizgilerdeki boşlukları ve diğer tüyleri görmezden gelmek. (Genellikle: yerine de = olabilir).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.