คำพูดเดี่ยวเทียบกับเครื่องหมายคำพูดคู่ [ปิด]


79

ฉันเพิ่งเริ่มงานที่ฉันเขียน Python หลังจากมาจากพื้นหลัง Java และฉันสังเกตเห็นว่านักพัฒนารายอื่นมักจะพูดสตริงโดยใช้เครื่องหมายคำพูดเดี่ยว ( '') แทนที่จะเป็นเครื่องหมายคำพูดคู่ ( "") ตัวอย่างเช่น:

line1 = 'This is how strings typically look.'
line2 = "Not like this."

มีเหตุผลใดที่นอกเหนือไปจากความชอบส่วนตัวหรือไม่? นี่เป็นวิธีที่เหมาะสมในการอ้างอิงสตริงหรือไม่ โดยเฉพาะสิ่งที่ฉันต้องการทราบคือหากมีมาตรฐานบางประเภทหรือวิธีปฏิบัติที่ดีที่สุดที่ยอมรับได้ซึ่งผลักดันรูปแบบการเข้ารหัสนี้


5
ถ้าคุณเคยได้รับในการRubyมีจริงเป็นความแตกต่างทางเทคนิคระหว่างคำพูดเดี่ยวและคู่ เครื่องหมายคำพูดคู่สนับสนุนการแก้ไขสตริง - เครื่องหมายคำพูดเดี่ยวแยกเป็นตัวอักษร
KChaloux

5
เช่นเดียวกับ Perl และเชลล์ส่วนใหญ่
Blrfl

18
คำถามนี้เป็นอย่างไร "ไม่สร้างสรรค์" ในฐานะผู้เริ่มต้น python แบบสัมบูรณ์ฉันจำเป็นต้องรู้สิ่งนี้ถ้าคุณเขียน bash script จะมีความแตกต่างใหญ่
Magicsowon

19
ไม่สร้างสรรค์ใช่ไหม โธ่ ผลการค้นหา google ครั้งแรกสำหรับ "python single double quote" จะบอกสิ่งที่คุณต้องรู้ได้อย่างรวดเร็ว ขอบคุณที่ขอให้เอริคและตอบกลับอย่างดี
aggieNick02

คำตอบ:


65

คำตอบอื่น ๆ นั้นถูกต้องซึ่งทำให้ไม่มีความแตกต่างทางเทคนิค แต่ฉันเห็นกฎสไตล์แบบไม่เป็นทางการในโครงการโอเพ่นซอร์สสองรายการ: การใช้อัญประกาศคู่สำหรับสตริงที่อาจปรากฏต่อผู้ใช้ในที่สุด (ไม่ว่าพวกเขาต้องการหรือไม่ก็ตาม การแปล) และอัญประกาศเดี่ยวใช้สำหรับสตริงที่เกี่ยวข้องกับการทำงานของโค้ดเอง (เช่นคีย์ dict, นิพจน์ทั่วไป, SQL)

นี่ไม่ใช่กฎสากล (หรือประมวลผลเป็น PEP) เช่นเดียวกับลักษณะอื่น ๆ โดยพลการของการเข้ารหัสมันจะลงกฎของท้องถิ่น

โปรดทราบว่า PEP 8 (ซึ่งฉันไม่ได้สังเกตเห็นเมื่อฉันเขียนคำตอบนี้) พูดว่า :

PEP นี้ไม่ได้แนะนำสำหรับสิ่งนี้ เลือกกฎและติดมัน เมื่อสตริงมีอักขระเครื่องหมายคำพูดเดี่ยวหรือคู่ให้ใช้อักขระอื่นเพื่อหลีกเลี่ยงแบ็กสแลชในสตริง มันช่วยปรับปรุงการอ่าน

ในฐานะที่เป็นผู้แสดงความคิดเห็นชี้ว่าสิ่งนี้ไม่ได้ขัดแย้งกันขึ้นอยู่กับว่าคุณตีความ "กฎ" อย่างไร สิ่งที่ฉันแนะนำไม่ได้ผลกับคำพูดช่วงครึ่งหลัง


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

4
@NilsvonBarth The PEP บอกว่า "เลือกกฎและยึดติดกับมัน" ไม่ใช่ "เลือกตัวละครที่คัดสรรและยึดติดกับมัน" "อัญประกาศคู่กับข้อความที่ผู้ใช้มองเห็นได้, อัญประกาศเดียวสำหรับสิ่งที่ใช้โดยเครื่อง" ดูเหมือนกฎที่สมบูรณ์แบบที่สุด
แทนเนอร์ Swett

1
@Tanner Swett ขออภัยคุณพูดถูก เป็นคู่มือสไตล์ Google Python ที่ระบุ“ ภายในไฟล์” google.github.io/styleguide/pyguide.html#310-strings
Nils von Barth

Black จะจัดรูปแบบสตริง Python ที่ล้อมรอบด้วยเครื่องหมายคำพูดคู่ แม้แต่ jslint ต้องการให้สตริง JavaSciprt ล้อมรอบด้วยเครื่องหมายคำพูดคู่ ภาษาที่เก่ากว่าส่วนใหญ่ไม่เคยมีตัวเลือก เพียงเพราะคุณทำได้ไม่ได้หมายความว่าคุณควรทำ แน่นอนว่ามีบางกรณีที่นี่เป็นสิ่งที่ดีมากที่จะมีเช่นเมื่อคุณมีเครื่องหมายคำพูดในสตริง อย่างไรก็ตามในทางปฏิบัติแล้วสตริงส่วนใหญ่ของคุณควรมาจากชุดข้อมูลที่ไม่ได้เข้ารหัสไว้อย่างหนักในฐานรหัสของคุณ
Bobort

1
@bobort แม้ว่าคุณจะค้นหาสตริงในระบบการแปลหรือ UI แต่คุณก็ยังต้องมีคีย์สตริงสำหรับรหัสเหล่านั้น แต่ฉันยอมรับว่าสิ่งต่าง ๆ ได้ดำเนินต่อไปและไม่มีประโยชน์ใด ๆ กับความแตกต่างนี้
Detly

21

มันง่ายมาก:

  • อัญประกาศเดี่ยวอนุญาตให้มีการฝังเครื่องหมายอัญประกาศคู่ที่ไม่ได้ Escape
  • เครื่องหมายอัญประกาศคู่อนุญาตให้ฝังคำพูดเดี่ยวที่ไม่ใช้ Escape

Pythonic ส่วนใหญ่จะใช้'(อัญประกาศเดี่ยว) จนกว่าคุณต้องการอัญประกาศคู่ได้

ข้อความต่อไปนี้มาโดยตรงจากเอกสารเกี่ยวกับตัวอักษร String

มีอยู่ในสตริง Unicode คำนำหน้า 'b' หรือ 'B' จะถูกละเว้นใน Python 2 มันบ่งชี้ว่าตัวอักษรควรเป็นตัวอักษรไบต์ใน Python 3 (เช่นเมื่อรหัสถูกแปลงโดยอัตโนมัติด้วย 2to3) คำนำหน้า 'u' หรือ 'b' อาจตามด้วยคำนำหน้า 'r'

ในสตริงที่มีการเสนอราคาแบบสามบรรทัดจะมีการขึ้นบรรทัดใหม่และเครื่องหมายคำพูดที่ไม่ใช้ค่า Escape (และจะถูกเก็บไว้) ยกเว้นว่าเครื่องหมายคำพูดที่ไม่ใช้ค่า Escape สามค่าในแถวจะยุติสตริง (“ เครื่องหมายคำพูด” คืออักขระที่ใช้ในการเปิดสตริงนั่นคือ 'หรือ ")


15
คำถามของหลักสูตรคือ - ทำไม Pythonic ถึงต้องการราคาเดียวเมื่อเกือบทุกภาษาอื่น ๆ ใช้เครื่องหมายคำพูดคู่?
Martin Beckett

13
@MartinBeckett เพราะ

3
Ahh แน่นอน ;-)
Martin Beckett

6
@JarrodRoberson: ผมคิดว่า "เพราะ" (หรือ 'เพราะ' ถ้าคุณจะ) เป็นคำตอบที่ถูกต้องถ้ามันเขียนในบาง PEP (หรือคล้ายกัน) ว่ามันเป็นวิธีที่ Pythonic ไม่อย่างนั้นมันเป็นเพียงทางเลือกส่วนตัว
โจอาคิมซาวเออร์

5
คำพูดเดียวดูสะอาดตาและไม่ต้องใช้ปุ่ม Shift ในการพิมพ์
JoelFan

17

จากมุมมองทางเทคนิคมันทำให้ไม่แตกต่างจากมุมมองสไตล์ความคิดไม่กี่:

  • ภาษาโปรแกรมอื่น ๆ ส่วนใหญ่ใช้เครื่องหมายคำพูดคู่
  • เมื่อเขียนเป็นภาษาอังกฤษมักจะใช้เครื่องหมายคำพูดคู่
  • การเสนอราคาเดี่ยวมีประโยชน์เมื่อคุณมีข้อความที่ไม่ใช่ด้านเทคนิค / การเล่าเรื่องจำนวนมากในแอปพลิเคชันของคุณเพราะจะช่วยให้คุณสามารถใช้เครื่องหมายคำพูดคู่ได้อย่างเป็นธรรมชาติมากขึ้น bar = '"It\'s awesome" he said.'
  • ในอีกด้านหนึ่งตัวอักษรคำพูดเดียวก็ใช้ในบางครั้งในภาษาอังกฤษ bar = "\"It's awesome\" he said."

โปรดทราบว่า "มักใช้ในสตริงทางเทคนิคเช่นกัน -e, g f'you ที่คุณส่ง" {dumb_thing} แต่นั่นก็โง่เกินไปสำหรับเรา! '
คริสเตียนซาวเออร์

4

ไม่มีความแตกต่างระหว่างการใช้เครื่องหมายคำพูดเดี่ยวและเครื่องหมายคำพูดคู่ใน Python ในแง่การปฏิบัติขึ้นอยู่กับชนิดของข้อมูลที่คุณทำงานด้วยคุณอาจพบว่ารูปแบบใดรูปแบบหนึ่งหรืออื่น ๆ สะดวกกว่า

ประเภทของคำพูดที่ใช้ "โดยค่าเริ่มต้น" (ที่ไม่มีเหตุผลที่น่าสนใจในการใช้อย่างใดอย่างหนึ่ง) เป็นเรื่องของการตั้งค่าส่วนตัว

สำหรับข้อมูลเพิ่มเติมให้ดูที่ส่วนของตัวอักษรสตริงในเอกสาร Python


4

บางสิ่งที่ควรพิจารณาเมื่อพัฒนานิสัยของคุณว่าจะใช้คำพูดเดียวหรือสองครั้งเป็นประจำ

เครื่องหมายคำพูดคู่ต้องใช้สองนิ้ว และมีแนวโน้มมากขึ้นสำหรับการพิมพ์ข้อผิดพลาดเช่นเดียวกับการลดความเร็ว

บรรณาธิการของคุณอาจแสดงตัวละครตัวหนึ่งที่ดีกว่าตัวละครอื่น; สำหรับการดีบักไวยากรณ์ของภาพที่ง่ายขึ้น

Docstrings ใช้ตัวละครสามตัว: ดูดีกว่ากันไหม? """""" หรือ ''''''

แม้ว่าฉันจะไม่ได้เห็นสิ่งนี้ใน Windows OS เครื่องมือไวยากรณ์หรือเอกสารคู่มือบางอย่างอาจคาดหวังคำพูดคู่เดียว

สำหรับบทเรียน Python ส่วนใหญ่ที่ฉันเคยเห็นฉันเห็นสิ่งที่ตรงกันข้ามกับประสบการณ์ของคุณ ฉันมักจะเห็นคำพูดสองครั้งที่ใช้


4

ในความคิดของฉันฉันต้องการใช้อัญประกาศคู่สำหรับสตริง

ทำไม? สำหรับโปรแกรมเมอร์ของภาษาอื่นสามารถปรับเปลี่ยนได้อย่างรวดเร็วและเข้าใจรหัสได้ง่ายขึ้น

หากโปรแกรมเมอร์ C ดู:

'Writing "It\'s big?" No.'

จะลังเลแทนที่จะเป็น:

"Writing \"It's big?\" No."

3
"กำลังเขียน \" มันใหญ่ใช่ไหม \ "ไม่"
API-Beast

@Lucio นั่นคือสิ่งที่ฉันได้ทำไปฉันไม่รู้ว่าฉันละเมิดมาตรฐาน Python ที่กำหนดไว้หรือไม่
Eric Hydrick

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