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


718

ตามเอกสารประกอบพวกมันค่อนข้างใช้แทนกันได้ มีเหตุผลโวหารที่จะใช้อย่างใดอย่างหนึ่งมากกว่าอื่น ๆ ?

คำตอบ:


525

ฉันชอบใช้อัญประกาศรอบ ๆ สตริงที่ใช้สำหรับการแก้ไขหรือที่เป็นข้อความภาษาธรรมชาติและอัญประกาศเดี่ยวสำหรับสตริงที่มีลักษณะคล้ายสัญลักษณ์ขนาดเล็ก แต่จะแบ่งกฎหากสตริงมีคำพูดหรือหากฉันลืม ฉันใช้เครื่องหมายคำพูดคู่สามเท่าสำหรับ docstrings และตัวอักษรสตริงดิบสำหรับนิพจน์ทั่วไปแม้ว่าจะไม่จำเป็นก็ตาม

ตัวอย่างเช่น:

LIGHT_MESSAGES = {
    'English': "There are %(number_of_lights)s lights.",
    'Pirate':  "Arr! Thar be %(number_of_lights)s lights."
}

def lights_message(language, number_of_lights):
    """Return a language-appropriate string reporting the light count."""
    return LIGHT_MESSAGES[language] % locals()

def is_pirate(message):
    """Return True if the given message sounds piratical."""
    return re.search(r"(?i)(arr|avast|yohoho)!", message) is not None

4
น่าสนใจฉันใช้มันในวิธีเดียวกัน ฉันจำไม่ได้ว่าเคยอ่านอะไรเลยที่จะผลักดันฉันไปในทิศทางนั้น ฉันยังใช้การเสนอราคาเดี่ยวสามครั้งสำหรับสตริงแบบยาวที่ไม่ได้มีไว้สำหรับมนุษย์เช่น html ดิบ อาจเป็นเรื่องเกี่ยวกับกฎการพูดภาษาอังกฤษ
ไมค์ A

12
ไพ ธ อนส่วนใหญ่เขียนโค้ดไว้อย่างนั้น ไม่มีกฎชัดเจน แต่เนื่องจากเรามักอ่านโค้ดในแบบนั้นมันจึงกลายเป็นนิสัย
E-satis

ฉันสงสัยว่าคำพูดที่เหมือนกันสำหรับสัญลักษณ์จริงๆมาจากทางลัดการแสดงออกของคำพูดใน Lisp / Scheme หรือไม่ ไม่ว่าจะในกรณีใด นอกจากนี้ฉัน mateys ถ้าเราทำตามแนวทางสไตล์ PEP 8 ฟังก์ชั่นควรจะตั้งชื่อ lights_message () และ is_pirate ()
yukondude

8
ฉันคิดว่า Perl สร้างความแตกต่างระหว่างสตริงที่ยกมาเดี่ยว (ไม่มีการแก้ไข) และสตริงที่ยกมาสองครั้ง (ที่มีการแก้ไข) และงูใหญ่ตัวแปลงสัญญาณที่อาจได้รับการสืบทอดนิสัยหรือไม่เคยปล่อยให้มันไป
Daren Thomas

2
ฉันใช้การประชุมเดียวกันรวมทั้งฉันใช้มันโดยให้ไฮไลต์ทุกอย่างไว้ในเครื่องหมายคำพูดเดี่ยวสามคำเป็น SQL
RoundTower

96

การอ้างอิงเอกสารอย่างเป็นทางการได้ที่https://docs.python.org/2.0/ref/strings.html :

ในภาษาอังกฤษล้วน: ตัวอักษรสตริงสามารถล้อมรอบในการจับคู่คำพูดเดียว (') หรือเครื่องหมายคำพูดคู่ (")

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


3
ใช่สำหรับฉันความมั่นคงเป็นกุญแจสำคัญดังนั้นฉันจึงใช้คนเดียวทุกที่ กดปุ่มน้อยลง, ไม่คลุมเครือและสม่ำเสมอ
mlissner

90

ผมเคยชอบ'โดยเฉพาะอย่างยิ่งสำหรับการที่ผมพบ'''docstrings''' """this creates some fluff"""นอกจากนี้ยัง'สามารถพิมพ์ได้โดยไม่ต้องShiftคีย์บนแป้นพิมพ์ภาษาสวิสเยอรมันของฉัน

ฉันมีการเปลี่ยนแปลงตั้งแต่การใช้คำพูดที่สามสำหรับ"""docstrings""", เพื่อให้สอดคล้องกับPEP 257


2
ฉันมักจะชอบอัญประกาศเดี่ยวเนื่องจากฉันเขียนโค้ด SQL ทุกวันและใช้อัญประกาศเดี่ยวสำหรับตัวอักษรสตริงใน T-SQL แต่ฉันจะใช้อัญประกาศคู่เพราะบางครั้ง docstrings สามารถใช้ปุยเล็กน้อยในพวกเขา
eksortso

4
การใช้คำพูดง่าย ๆ ในทุกที่สำหรับสตริงช่วยให้ฉันสามารถปิดการใช้งานส่วนต่าง ๆ ของซอร์สโค้ดโดยใช้เครื่องหมายคำพูดคู่สามตัว - ชนิดของ #if 0
สลัว

12
"ต้องใช้ปุ่ม Shift บนแป้นพิมพ์ QWERTY ของพีซีเท่านั้น บนแป้นพิมพ์ฉันพิมพ์"ได้ง่ายกว่าจริง ๆ
e-Satisfaction

6
บน keybord ของฉัน "และ" ทั้งคู่จำเป็นต้องใช้ปุ่ม shift
Lo --c Faure-Lacroix

10
คำตอบนี้ตรงกันข้ามกับแบบแผนของไพ ธ อน ดู PEP 257 ที่ระบุว่า: เพื่อความมั่นคงให้ใช้ "" "เครื่องหมายคำพูดสองสาม" "" เสมอรอบ ๆ เอกสาร python.org/dev/peps/pep-0257
Buttons840

44

ฉันจะด้วย:

  • เครื่องหมายคำพูดคู่สำหรับข้อความ
  • อัญประกาศเดี่ยวสำหรับสิ่งใดก็ตามที่ทำตัวเหมือนตัวระบุ
  • ดับเบิลอ้างสตริงตัวอักษรดิบสำหรับ regexps
  • เครื่องหมายคำพูดคู่สามเท่าสำหรับ docstrings

ฉันจะยึดติดกับสิ่งนั้นแม้ว่ามันจะมีความหมายมาก

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


26

หากสตริงที่คุณมีมีหนึ่งแล้วคุณควรใช้อื่น ๆ ตัวอย่างเช่น"You're able to do this", หรือ'He said "Hi!"'หรือนอกเหนือจากนั้นคุณควรจะมีความสอดคล้องเท่าที่จะทำได้ (ภายในโมดูลภายในแพ็คเกจภายในโครงการภายในองค์กร)

หากรหัสของคุณจะถูกอ่านโดยผู้ที่ทำงานกับ C / C ++ (หรือถ้าคุณสลับระหว่างภาษาเหล่านั้นกับ Python) ให้ใช้''สำหรับสตริงอักขระเดี่ยวและ""สำหรับสตริงที่ยาวขึ้นอาจช่วยให้การเปลี่ยนแปลงง่ายขึ้น (เช่นเดียวกันสำหรับการติดตามภาษาอื่นที่ไม่สามารถใช้แทนกันได้)

รหัส Python ที่ฉันเห็นใน wild มีแนวโน้มที่จะโปรดปราน"มากกว่า'แต่เพียงเล็กน้อยเท่านั้น ข้อยกเว้นอย่างหนึ่งคือมัน"""these"""เป็นเรื่องธรรมดามากกว่า'''these'''สิ่งที่ฉันได้เห็น


21

ความคิดเห็นที่ยกมาเป็นสามเท่าเป็นหัวข้อย่อยที่น่าสนใจของคำถามนี้ PEP 257 ระบุคำพูดที่สามสำหรับสตริง ฉันทำการตรวจสอบอย่างรวดเร็วโดยใช้ Google Code Search และพบว่าการเสนอราคาสองเท่าใน Pythonประมาณ 10 เท่าเป็นที่นิยมเท่ากับการเสนอราคาเดียวสามครั้ง - 1.3M เทียบกับ 131K ที่เกิดขึ้นในรหัสดัชนีของ Google ดังนั้นในกรณีที่มีหลายบรรทัดรหัสของคุณอาจจะเป็นที่คุ้นเคยกับคนมากขึ้นถ้ามันใช้คำพูดสองเท่า


13
"If you're going to use apostrophes, 
       ^

you'll definitely want to use double quotes".
   ^

ด้วยเหตุผลง่ายๆนั้นฉันมักจะใช้เครื่องหมายคำพูดคู่ด้านนอกเสมอ เสมอ

เมื่อพูดถึงปุยสิ่งที่ดีคือการทำให้ตัวอักษรสตริงของคุณเพรียวลงด้วย 'ถ้าคุณจะต้องใช้อักขระเลี่ยงเพื่อแสดงเครื่องหมายอะโพสโทรฟี? มันทำให้ผู้อ่านอ่านนิยายผิดหรือไม่? ฉันนึกไม่ออกว่าชั้นเรียนภาษาอังกฤษโรงเรียนมัธยมที่เจ็บปวดสำหรับคุณนั้นเป็นอย่างไร!


11
ถ้าคุณจะไป 'คำพูด' สิ่งที่คุณจะมั่นเหมาะต้องการที่จะใช้ราคาเดียว '
เปาโล

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

7

Python ใช้เครื่องหมายคำพูดแบบนี้:

mystringliteral1="this is a string with 'quotes'"
mystringliteral2='this is a string with "quotes"'
mystringliteral3="""this is a string with "quotes" and more 'quotes'"""
mystringliteral4='''this is a string with 'quotes' and more "quotes"'''
mystringliteral5='this is a string with \"quotes\"'
mystringliteral6='this is a string with \042quotes\042'
mystringliteral6='this is a string with \047quotes\047'

print mystringliteral1
print mystringliteral2
print mystringliteral3
print mystringliteral4
print mystringliteral5
print mystringliteral6

ซึ่งให้ผลลัพธ์ต่อไปนี้:

this is a string with 'quotes'
this is a string with "quotes"
this is a string with "quotes" and more 'quotes'
this is a string with 'quotes' and more "quotes"
this is a string with "quotes"
this is a string with 'quotes'

2
แต่"""This is a string with "quotes""""เพิ่ม SyntaxError สถานการณ์นี้จะแก้ไขได้อย่างไร? (เช่นเดียวกับ'''This is a string with 'quotes'''')
dolma33

1
แทรกเส้นแบ่งระหว่าง "เครื่องหมายคำพูด" และ "" "
นิโคลัส

1
@ dolma33 ข้อเสนอแนะของ Nicolas จะเปลี่ยนเนื้อหาของสตริง ทางออกที่ดีกว่านั้นอยู่ในคำตอบแล้ว: ถ้าสตริงของคุณลงท้ายด้วยอัญประกาศบางประเภทให้ใช้การอ้างทริปเปิลชนิดอื่น เช่น'''This is a string with "quotes"'''.
jpmc26

3

ฉันใช้อัญประกาศโดยทั่วไป แต่ไม่ใช่ด้วยเหตุผลเฉพาะ - อาจเป็นเพราะนิสัยจาก Java

ฉันเดาว่าคุณมีแนวโน้มที่จะต้องการอะพอสโทรฟีในสตริงตัวอักษรแบบอินไลน์มากกว่าที่คุณจะต้องการอัญประกาศ


3

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


2

มันอาจจะเป็นที่นิยมกว่าทุกอย่างโวหาร ฉันเพิ่งตรวจสอบ PEP 8 และไม่เห็นคำพูดใด ๆ

ฉันชอบคำพูดเดียวเพราะการกดแป้นเพียงครั้งเดียวแทนที่จะเป็นสองครั้ง นั่นคือฉันไม่ต้องบดปุ่ม Shift เพื่อให้พูดอย่างเดียว


1
PEP 8 เชื่อมโยงกับ PEP 257 ในประโยคแรกภายใต้ "Documentation Strings" ใน PEP 257 มีสถานะ: เพื่อความมั่นคงให้ใช้ "" "เครื่องหมายคำพูดคู่สาม" "" เสมอรอบ ๆ เอกสาร ใช้ r "" "คำพูดสองสามคำดิบ" "" ถ้าคุณใช้แบ็กสแลชใด ๆ ในเอกสารของคุณ สำหรับเอกสาร Unicode ให้ใช้ u "" "สตริงที่มีการเสนอราคาแบบ Unicode สาม" "" ยังฉันชอบรูปลักษณ์ที่สะอาดของคำพูดเดียวและเหตุผลการกดแป้นเดียวที่คุณให้
maxpolk

2

ใน Perl คุณต้องการใช้อัญประกาศเดี่ยวเมื่อคุณมีสตริงซึ่งไม่จำเป็นต้องสอดแทรกตัวแปรหรืออักขระที่ใช้ Escape เช่น \ n, \ t, \ r ฯลฯ

PHP สร้างความแตกต่างเช่นเดียวกับ Perl: เนื้อหาในเครื่องหมายคำพูดเดียวจะไม่ถูกตีความ (ไม่ใช่แม้แต่ \ n จะถูกแปลง) ซึ่งต่างกับเครื่องหมายคำพูดคู่ซึ่งสามารถมีตัวแปรที่จะพิมพ์ค่าของพวกเขา

Python ไม่ได้ฉันกลัว ในทางเทคนิคแล้วไม่มีโทเค็นของ $ token (หรือที่คล้ายกัน) เพื่อแยกชื่อ / ข้อความจากตัวแปรใน Python ฟีเจอร์ทั้งสองทำให้ Python อ่านได้ง่ายขึ้นและสับสนน้อยลง คำพูดเดี่ยวและคู่สามารถใช้แทนกันได้ใน Python


เพื่อเสริมสิ่งที่คุณพูด \ n จะถูกตีความในเครื่องหมายคำพูดคู่ใน PHP และ Perl เท่านั้นในขณะที่ใน Python จะทำงานทั้งในเครื่องหมายคำพูดคู่และคำเดี่ยว
stivlo

1
@stivlo: ยกเว้นว่าคุณจะสร้างสตริงดิบจากมันโดยการเพิ่มที่rด้านหน้าของสตริงตัวอักษร ดังนั้นprint 'a\nb'จะพิมพ์สองบรรทัด แต่print r'a\nb'จะพิมพ์หนึ่งบรรทัด
Tadeck

1

ฉันเลือกที่จะใช้เครื่องหมายคำพูดคู่เพราะง่ายต่อการมองเห็น


1

ฉันแค่ใช้อะไรก็ตามที่ฉันชอบในเวลา; มันสะดวกที่จะสลับไปมาระหว่างสองคนได้อย่างง่ายดาย!

แน่นอนว่าเมื่ออ้างข้อความอักขระการสลับไปมาระหว่างทั้งสองอาจไม่แปลกเลย ...


0

รสนิยมของทีมหรือแนวทางการเขียนโค้ดของโครงการของคุณ

หากคุณอยู่ในสภาพแวดล้อมหลายภาษาคุณอาจต้องการส่งเสริมให้ใช้อัญประกาศชนิดเดียวกันสำหรับสตริงที่ภาษาอื่นใช้เช่น อื่น ๆ ส่วนตัวฉันชอบรูปลักษณ์ที่ดีที่สุดของ '


0

ไม่มีเท่าที่ฉันรู้ แม้ว่าคุณจะดูรหัสบางอย่างก็ตาม "" มักใช้กับสตริงข้อความ (ฉันเดาว่า 'เป็นเรื่องธรรมดามากกว่าข้อความภายใน ") และ' 'จะปรากฏในแฮชคีย์และสิ่งต่าง ๆ เช่นนั้น


0

ฉันตั้งเป้าที่จะลดจำนวนพิกเซลและทำให้ประหลาดใจ โดยทั่วไปฉันต้องการ'ลดขนาดพิกเซลให้น้อยลง แต่"หากสตริงมีเครื่องหมายอะโพสโทรฟีให้ทำการย่อขนาดพิกเซลอีกครั้ง สำหรับ docstring ฉันชอบ"""มากกว่า'''เพราะอันหลังไม่ใช่เรื่องธรรมดาผิดปกติและน่าประหลาดใจ หากตอนนี้ฉันมีสตริงจำนวนหนึ่งที่ฉันใช้"ตามตรรกะข้างต้น แต่ยังมีอีกสตริงหนึ่งที่สามารถใช้ได้กับ a 'ฉันยังอาจใช้"มันเพื่อรักษาความมั่นคงเท่านั้นเพื่อลดความประหลาดใจ

บางทีมันอาจช่วยให้คิดถึงปรัชญาการย่อขนาดพิกเซลด้วยวิธีต่อไปนี้ คุณจะค่อนข้างที่ตัวอักษรภาษาอังกฤษดูเหมือนA B CหรือAA BB CC? ตัวเลือกหลังเสีย 50% ของพิกเซลที่ไม่ว่างเปล่า


-1

ฉันใช้เครื่องหมายคำพูดคู่เพราะฉันทำมาหลายปีในภาษาส่วนใหญ่ (C ++, Java, VB …) ยกเว้น Bash เพราะฉันยังใช้เครื่องหมายคำพูดคู่ในข้อความปกติและเพราะฉันใช้แป้นพิมพ์ที่ไม่ใช่ภาษาอังกฤษ ตัวละครทั้งสองต้องการปุ่ม Shift


-4

' = "

/= \=\\

ตัวอย่าง:

f = open('c:\word.txt', 'r')
f = open("c:\word.txt", "r")
f = open("c:/word.txt", "r")
f = open("c:\\\word.txt", "r")

ผลลัพธ์เหมือนกัน

= >> ไม่พวกมันไม่เหมือนกัน แบ็กสแลชเดี่ยวจะหนีจากตัวละคร คุณเพียงแค่เกิดขึ้นกับโชคออกในตัวอย่างเพราะนั่น\kและ\wไม่ได้หนีที่ถูกต้องเหมือน\tหรือ\nหรือ\\หรือ\"

หากคุณต้องการใช้แบ็กสแลชเดี่ยว (และตีความให้เป็นแบ็กสแลช) คุณต้องใช้สตริง "raw" คุณสามารถทำได้โดยใส่ ' r' ไว้ข้างหน้าสตริง

im_raw = r'c:\temp.txt'
non_raw = 'c:\\temp.txt'
another_way = 'c:/temp.txt'

เท่าที่เส้นทางใน Windows มีความเกี่ยวข้องเครื่องหมายทับซ้ายจะถูกตีความเช่นเดียวกัน ชัดเจนสตริงตัวเองแตกต่างกัน ฉันจะไม่รับประกันว่าพวกเขาจัดการวิธีนี้ในอุปกรณ์ภายนอกแม้ว่า


อึศักดิ์สิทธิ์นี้เก่า แต่ฉันต้องการแสดงความคิดเห็นต่อไปเพื่อชี้ให้เห็นว่าการใช้เครื่องหมายทับซ้ายอาจทำงานได้กับ windows แต่ยังขึ้นอยู่กับระบบ เพื่อให้แน่ใจว่าคุณไม่ต้องพึ่งพาระบบปฏิบัติการใช้os.path.join()
Adam Smith
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.