วิธีที่ถูกต้องในการกำหนดการเข้ารหัสซอร์สของ Python


163

PEP 263กำหนดวิธีการประกาศการเข้ารหัสซอร์สของ Python

โดยปกติแล้ว 2 บรรทัดแรกของไฟล์ Python ควรเริ่มต้นด้วย:

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

แต่ฉันได้เห็นไฟล์มากมายที่เริ่มต้นด้วย:

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

=> การเข้ารหัสแทนการเข้ารหัส

ดังนั้นวิธีที่ถูกต้องในการประกาศการเข้ารหัสไฟล์คืออะไร?

การเข้ารหัสได้รับอนุญาตเพราะ regex ที่ใช้นั้นขี้เกียจหรือไม่ หรือมันเป็นเพียงการประกาศการเข้ารหัสไฟล์อีกรูปแบบหนึ่ง?

ฉันถามคำถามนี้เพราะ PEP ไม่ได้พูดคุยเกี่ยวกับการเข้ารหัสก็แค่พูดคุยเกี่ยวกับการเขียนโปรแกรม


4
โดยวิธีการเพื่อความยืดหยุ่นและพกพามากขึ้นขอแนะนำให้ใช้#!/usr/bin/env pythonแทน#!/usr/bin/python
glarrain

7
ฉันชอบวิธีที่ไม่มีคำตอบในหน้านี้มีตัวอย่างง่ายๆที่ใช้งานได้สำหรับพูด UTF8 StackOverly ที่ดีที่สุด
aaa90210

2
ฉันแค่อยากจะเพิ่มว่างูหลาม 3 มีการเปลี่ยนแปลงเริ่มต้นการเข้ารหัสจากการascii UTF-8เปรียบเทียบ: หลาม 2.7 เอกสารกับงูหลาม 3.7 เอกสาร UTF-8ซึ่งหมายความว่าคุณสามารถละเว้นการเข้ารหัสนี้ถ้าคุณต้องการที่จะระบุ
gertvdijk

คำตอบ:


161

ตรวจสอบเอกสารที่นี่ :

"หากความคิดเห็นในบรรทัดแรกหรือบรรทัดที่สองของสคริปต์ Python ตรงกับนิพจน์ทั่วไปcoding[=:]\s*([-\w.]+)ความคิดเห็นนี้จะถูกประมวลผลเป็นการประกาศการเข้ารหัส"

"รูปแบบที่แนะนำของนิพจน์นี้คือ

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

ซึ่งได้รับการยอมรับจาก GNU Emacs และ

# vim:fileencoding=<encoding-name>

ซึ่งได้รับการยอมรับจาก VIM ของ Bram Moolenaar "

ดังนั้นคุณสามารถใส่อะไรไว้ก่อนส่วน "การเข้ารหัส" แต่ติดกับ "การเข้ารหัส" (โดยไม่มีคำนำหน้า) ถ้าคุณต้องการที่จะเข้ากันได้ 100% python-docs- คำแนะนำที่เข้ากันได้

โดยเฉพาะอย่างยิ่งคุณต้องใช้สิ่งที่ Python รู้จักและซอฟต์แวร์แก้ไขเฉพาะที่คุณใช้ (ถ้าต้องการ / ยอมรับสิ่งใดเลย) เช่นcodingแบบฟอร์มได้รับการยอมรับ (นอกกรอบ) โดย GNU Emacs แต่ไม่ใช่กลุ่ม (ใช่โดยไม่มีข้อตกลงสากลมันเป็นสงครามสนามหญ้า )


10
ทำไม-*-?
Iulian Onofrei

10
-*-เพื่อให้แน่ใจว่าเส้นเป็นที่ยอมรับโดย GNU Emacs (แก้ไขข้อความที่เป็นที่นิยมกับโปรแกรมเมอร์บางคน) โปรดทราบว่าตรงกันข้ามกับคำตอบนี้ทั้งรูปแบบ Emacs และรูปแบบ Vim นั้นเป็นแบบ 100% python-docs-Recommendation-compatible สตริง "ตรงกันข้ามกับ Python API)
martinjs

1
ความต้องการที่เฉพาะเจาะจงเพื่อ Emacs สั่งฝังมีเอกสารที่gnu.org/software/emacs/manual/html_node/emacs/... ในช่วงสั้น ๆ <prefix>-*- var: value[; ...] -*-รูปแบบสำหรับการเริ่มต้นของไฟล์ที่เป็น:
ivan_pozdeev

38

PEP 263:

บรรทัดแรกหรือบรรทัดที่สองต้องตรงกับนิพจน์ทั่วไป "coding [: =] \ s * ([- \ w.] +)"

ดังนั้นการจับคู่ "en coding: UTF-8 "

PEP ให้ตัวอย่าง:

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

 

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

31

เพียงคัดลอกคำสั่งวางด้านล่างด้านบนของโปรแกรมมันจะแก้ปัญหาการเข้ารหัสตัวอักษร

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

3

ตั้งแต่วันนี้ - มิถุนายน 2561


PEP 263กล่าวถึง regex ดังนี้:

ในการกำหนดการเข้ารหัสซอร์สโค้ดความคิดเห็นเวทย์มนตร์จะต้องอยู่ในไฟล์ต้นฉบับไม่ว่าจะเป็นบรรทัดแรกหรือบรรทัดที่สองในไฟล์เช่น:

# coding=<encoding name>

หรือ (ใช้รูปแบบที่รู้จักโดยบรรณาธิการยอดนิยม):

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

หรือ:

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

แม่นยำยิ่งขึ้นบรรทัดแรกหรือบรรทัดที่สองต้องตรงกับนิพจน์ทั่วไปต่อไปนี้:

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

ดังนั้นเมื่อสรุปโดยคำตอบอื่น ๆ แล้วมันจะจับคู่codingกับคำนำหน้าใด ๆ แต่ถ้าคุณต้องการให้เป็นไปตาม PEP ตามที่ได้รับ (แม้ว่าเท่าที่ฉันสามารถบอกได้การใช้encodingแทนที่จะcodingไม่ละเมิด PEP 263 ในทางใดทางหนึ่ง) - ติดกับ 'ธรรมดา' codingไม่มีคำนำหน้า


1

ถ้าฉันไม่เข้าใจผิดข้อเสนอดั้งเดิมสำหรับการเข้ารหัสไฟล์ต้นฉบับคือการใช้นิพจน์ปกติสำหรับสองบรรทัดแรกซึ่งจะอนุญาตให้ทั้งสอง

ฉันคิดว่า regex เป็นบางสิ่งบางอย่างตามสายของcoding:บางสิ่งบางอย่าง

ฉันพบสิ่งนี้: http://www.python.org/dev/peps/pep-0263/ ซึ่งเป็นข้อเสนอดั้งเดิม แต่ฉันไม่สามารถหาข้อมูลจำเพาะสุดท้ายที่ระบุได้อย่างชัดเจนถึงสิ่งที่พวกเขาทำ

ฉันเคยชินencoding:กับเอฟเฟกต์ที่ยอดเยี่ยม

ลองเปลี่ยนไปใช้สิ่งที่แตกต่างอย่างสิ้นเชิงเช่นduhcoding: ...เพื่อดูว่ามันใช้ได้ดีหรือไม่


0

ฉันสงสัยว่ามันคล้ายกับ Ruby - วิธีใดวิธีหนึ่งก็ใช้ได้

นี่คือสาเหตุหลักเนื่องจากตัวแก้ไขข้อความที่แตกต่างกันใช้วิธีการที่แตกต่างกัน (เช่นสองสิ่งนี้) ในการทำเครื่องหมายการเข้ารหัส

ด้วย Ruby ตราบใดที่หนึ่งหรือที่สองหากมีบรรทัด shebang จะมีสตริงที่ตรงกับ:

coding: encoding-name

และละเว้นช่องว่างใด ๆ และปุยอื่น ๆ ในบรรทัดเหล่านั้น (บ่อยครั้งอาจเป็น a = แทนที่จะเป็น:, เกินไป)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.