Dấu ngoặc đơn so với dấu ngoặc kép trong Python [đã đóng]


718

Theo tài liệu, chúng có thể hoán đổi cho nhau. Có một lý do phong cách để sử dụng cái này hơn cái kia không?

Câu trả lời:


525

Tôi thích sử dụng dấu ngoặc kép xung quanh các chuỗi được sử dụng để nội suy hoặc là thông điệp ngôn ngữ tự nhiên và dấu ngoặc đơn cho các chuỗi giống như biểu tượng nhỏ, nhưng sẽ phá vỡ quy tắc nếu chuỗi chứa dấu ngoặc kép hoặc nếu tôi quên. Tôi sử dụng ba dấu ngoặc kép cho các tài liệu và chuỗi ký tự thô cho các biểu thức chính quy ngay cả khi chúng không cần thiết.

Ví dụ:

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
Thật thú vị, tôi sử dụng chúng theo cùng một cách chính xác. Tôi không nhớ đã từng đọc bất cứ điều gì để thúc đẩy tôi theo hướng đó. Tôi cũng sử dụng ba dấu ngoặc đơn cho chuỗi dài không dành cho con người, như html thô. Có lẽ đó là một cái gì đó để làm với các quy tắc trích dẫn tiếng Anh.
Mike A

12
Hầu hết các lập trình viên python mã theo cách đó. Không có quy tắc rõ ràng, nhưng vì chúng ta thường đọc mã theo cách đó, nó trở thành một thói quen.
e-satis

Tôi tự hỏi nếu các trích dẫn duy nhất cho những thứ giống như biểu tượng thực sự đến từ lối tắt biểu thức trích dẫn trong Lisp / Scheme. Trong mọi trường hợp, nó trực quan. Ngoài ra, đối với tôi, nếu chúng ta tuân theo các nguyên tắc kiểu PEP 8, các hàm thực sự nên được đặt tên là đèn_message () và is_pirate ().
yukondude

8
Tôi nghĩ Perl đã phân biệt giữa các chuỗi trích dẫn đơn (không nội suy) và chuỗi trích dẫn kép (có nội suy) và các lập trình viên python có thể đã thừa hưởng thói quen hoặc không bao giờ bỏ qua.
Daren Thomas

2
Tôi sử dụng cùng một quy ước, cộng với việc tôi lạm dụng nó bằng cách làm nổi bật mọi thứ trong ba dấu ngoặc đơn dưới dạng SQL.
RoundTower

96

Trích dẫn các tài liệu chính thức tại https://docs.python.org/2.0/ref/strings.html :

Trong tiếng Anh đơn giản: Chuỗi ký tự có thể được đặt trong các dấu ngoặc đơn (') hoặc dấu ngoặc kép (").

Vì vậy, không có sự khác biệt. Thay vào đó, mọi người sẽ bảo bạn chọn bất kỳ phong cách nào phù hợp với bối cảnh và phải nhất quán . Và tôi đồng ý - thêm rằng thật vô nghĩa khi cố gắng đưa ra "quy ước" cho loại điều này bởi vì bạn sẽ chỉ gây nhầm lẫn cho bất kỳ người mới nào.


3
yeah, đối với tôi tính nhất quán là chìa khóa, vì vậy tôi chỉ sử dụng đĩa đơn ở mọi nơi. Ít nhấn phím hơn, không mơ hồ và nhất quán.
mlissner

90

Tôi đã từng thích ', đặc biệt là '''docstrings''', như tôi tìm thấy """this creates some fluff""". Ngoài ra, 'có thể được gõ mà không cần Shiftphím trên bàn phím tiếng Đức Thụy Sĩ của tôi.

Kể từ đó, tôi đã thay đổi sử dụng ba dấu ngoặc kép """docstrings"""để tuân thủ PEP 257 .


2
Tôi có xu hướng thích các trích dẫn đơn, vì tôi viết mã SQL mỗi ngày và các trích dẫn đơn được sử dụng cho các chuỗi ký tự trong T-SQL. Nhưng tôi sử dụng ba dấu ngoặc kép, bởi vì các tài liệu đôi khi có thể sử dụng một chút lông tơ trong đó.
eksortso

4
Sử dụng ở mọi nơi các trích dẫn đơn giản cho chuỗi cho phép tôi vô hiệu hóa các phần của mã nguồn bằng ba dấu ngoặc kép - loại '#if 0' và '#endif'.
mờ

12
"chỉ cần một phím shift trên bàn phím PC QWERTY. Trên bàn phím của tôi, "thực sự dễ dàng hơn để gõ.
e-satis

6
trên keybord của tôi "và 'cả hai đều yêu cầu phím shift.
Loïc Faure-Lacroix

10
Câu trả lời này trái với quy ước của trăn; xem PEP 257 có nội dung: Để thống nhất, luôn luôn sử dụng "" "ba dấu ngoặc kép" "" xung quanh các tài liệu. python.org/dev/peps/pep-0257
Nút840

44

Tôi với Will:

  • Báo giá kép cho văn bản
  • Dấu ngoặc đơn cho bất cứ điều gì hoạt động như một định danh
  • Nhân đôi chuỗi ký tự thô cho regexps
  • Báo giá gấp đôi cho các tài liệu

Tôi sẽ kiên trì với điều đó ngay cả khi nó có nghĩa là rất nhiều lối thoát.

Tôi nhận được giá trị cao nhất trong số các định danh trích dẫn duy nhất nổi bật vì các trích dẫn. Phần còn lại của thực tiễn là ở đó chỉ để cung cấp cho những định danh được trích dẫn duy nhất một số phòng đứng.


26

Nếu chuỗi bạn có chứa một chuỗi, thì bạn nên sử dụng chuỗi khác. Ví dụ "You're able to do this", hoặc 'He said "Hi!"'. Ngoài ra, bạn chỉ cần nhất quán nhất có thể (trong một mô-đun, trong một gói, trong một dự án, trong một tổ chức).

Nếu những người làm việc với C / C ++ (hoặc nếu bạn chuyển đổi giữa các ngôn ngữ đó với Python) sẽ đọc mã của bạn, thì việc sử dụng ''cho các chuỗi ký tự đơn và ""cho các chuỗi dài hơn có thể giúp dễ dàng chuyển đổi. (Tương tự như vậy để theo các ngôn ngữ khác, nơi chúng không thể thay thế cho nhau).

Mã Python tôi đã thấy trong tự nhiên có xu hướng ủng hộ "hơn ', nhưng chỉ một chút. Một ngoại lệ là """these"""phổ biến hơn nhiều so với '''these''', từ những gì tôi đã thấy.


21

Ba ý kiến ​​trích dẫn là một chủ đề thú vị của câu hỏi này. PEP 257 chỉ định ba dấu ngoặc kép cho chuỗi doc . Tôi đã kiểm tra nhanh bằng cách sử dụng Google Code Search và thấy rằng ba dấu ngoặc kép trong Python phổ biến gấp 10 lần so với ba dấu ngoặc đơn - lần xuất hiện 1,3 triệu so với 131K trong mã chỉ mục của Google. Vì vậy, trong trường hợp nhiều dòng, mã của bạn có thể sẽ quen thuộc hơn với mọi người nếu nó sử dụng ba dấu ngoặc kép.


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

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

Vì lý do đơn giản đó, tôi luôn sử dụng dấu ngoặc kép ở bên ngoài. Luôn luôn

Nói về lông tơ, điều gì tốt là hợp lý hóa chuỗi ký tự của bạn với 'nếu bạn sẽ phải sử dụng các ký tự thoát để biểu thị dấu nháy đơn? Nó có xúc phạm các lập trình viên để đọc tiểu thuyết? Tôi không thể tưởng tượng được lớp học tiếng Anh ở trường trung học đau đớn như thế nào đối với bạn!


11
'Nếu bạn định "trích dẫn" một cái gì đó, bạn chắc chắn sẽ muốn sử dụng các trích dẫn duy nhất'
Paolo

Ý kiến ​​của tôi đã thay đổi rất nhiều kể từ khi tôi viết bài này. Bây giờ chỉ là một tình huống mà tôi sẽ tranh luận rằng tôi sẽ sử dụng dấu ngoặc kép. Một cái khác sẽ là của bạn trong bối cảnh sử dụng dấu ngoặc đơn. Xem câu trả lời được chấp nhận cho lập trường hiện tại của tôi về vấn đề chi tiết hơn. Tôi nghĩ đó là một ví dụ tuyệt vời về cách nó nên được trình bày cho nhiều đối tượng.
Droogans

7

Python sử dụng dấu ngoặc kép như thế này:

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

Cung cấp đầu ra sau:

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
Nhưng """This is a string with "quotes""""làm tăng một SyntaxError. Làm thế nào tình trạng này có thể được giải quyết? (giống như với '''This is a string with 'quotes'''')
dolma33

1
Chèn một dấu ngắt dòng giữa "dấu ngoặc kép" và "" "
Nicolas

1
@ dolma33 Đề xuất của Nicolas sẽ thay đổi nội dung của chuỗi. Một giải pháp tốt hơn là đã có trong câu trả lời: nếu chuỗi của bạn kết thúc với một số loại báo giá, sử dụng khác loại quote ba. Ví dụ '''This is a string with "quotes"'''.
jpmc26

3

Tôi sử dụng dấu ngoặc kép nói chung, nhưng không vì bất kỳ lý do cụ thể nào - Có lẽ là do thói quen từ Java.

Tôi đoán bạn cũng có nhiều khả năng muốn dấu nháy đơn trong một chuỗi ký tự nội tuyến hơn là bạn muốn có dấu ngoặc kép.


3

Cá nhân tôi gắn bó với cái này hay cái khác. Nó không thành vấn đề. Và cung cấp ý nghĩa của riêng bạn để trích dẫn chỉ là để gây nhầm lẫn cho người khác khi bạn cộng tác.


2

Nó có lẽ là một sở thích phong cách hơn bất cứ điều gì. Tôi chỉ kiểm tra PEP 8 và không thấy bất kỳ đề cập nào về dấu ngoặc đơn so với dấu ngoặc kép.

Tôi thích dấu ngoặc đơn vì nó chỉ có một lần nhấn phím thay vì hai lần. Đó là, tôi không phải nghiền phím shift để trích dẫn.


1
PEP 8 liên kết với PEP 257 trong câu đầu tiên trong "Chuỗi tài liệu". Trong PEP 257 có ghi: Để thống nhất, luôn luôn sử dụng "" "ba dấu ngoặc kép" "" xung quanh các tài liệu. Sử dụng r "" "ba dấu ngoặc kép thô" "" nếu bạn sử dụng bất kỳ dấu gạch chéo ngược nào trong tài liệu của bạn. Đối với tài liệu Unicode, sử dụng u "" "Chuỗi ba trích dẫn Unicode" "". Tuy nhiên, tôi thích giao diện rõ ràng của một trích dẫn và một lý do nhấn phím bạn đưa ra.
maxpolk

2

Trong Perl, bạn muốn sử dụng các dấu ngoặc đơn khi bạn có một chuỗi không cần nội suy các biến hoặc các ký tự thoát như \ n, \ t, \ r, v.v.

PHP tạo ra sự khác biệt tương tự như Perl: nội dung trong các trích dẫn đơn sẽ không được diễn giải (thậm chí sẽ không được chuyển đổi), trái ngược với các trích dẫn kép có thể chứa các biến được in ra giá trị của chúng.

Python không, tôi sợ. Về mặt kỹ thuật, không có mã thông báo $ (hoặc tương tự) để tách tên / văn bản khỏi một biến trong Python. Cả hai tính năng làm cho Python dễ đọc hơn, ít gây nhầm lẫn hơn. Dấu ngoặc đơn và dấu ngoặc kép có thể được sử dụng thay thế cho nhau trong Python.


Để củng cố những gì bạn nói \ n sẽ chỉ được diễn giải bằng dấu ngoặc kép trong PHP và Perl, trong khi trong Python sẽ hoạt động cả trong dấu ngoặc kép và dấu ngoặc đơn
stivlo

1
@stivlo: Trừ khi bạn sẽ tạo một chuỗi thô từ nó, bằng cách thêm rvào trước chuỗi ký tự. Vì vậy, print 'a\nb'sẽ in cho bạn hai dòng, nhưng print r'a\nb'sẽ in cho bạn một dòng.
Tadeck


1

Tôi chỉ sử dụng bất cứ thứ gì nổi bật vào thời điểm đó; thật tiện lợi khi có thể chuyển đổi giữa hai người một cách nhanh chóng!

Tất nhiên, khi trích dẫn trích dẫn, việc chuyển đổi giữa hai người có thể không quá kỳ cục ...


0

Hương vị nhóm của bạn hoặc hướng dẫn mã hóa dự án của bạn.

Nếu bạn đang ở trong một môi trường đa ngôn ngữ, bạn có thể muốn khuyến khích sử dụng cùng loại trích dẫn cho các chuỗi mà ngôn ngữ khác sử dụng, chẳng hạn. Khác, cá nhân tôi thích nhất cái nhìn của '


0

Không có gì xa như tôi biết. Mặc dù nếu bạn xem một số mã, "" thường được sử dụng cho các chuỗi văn bản (tôi đoán 'là phổ biến bên trong văn bản hơn ") và' 'xuất hiện trong các hàm băm và những thứ tương tự.


0

Tôi nhằm mục đích giảm thiểu cả pixel và bất ngờ. Tôi thường thích 'để giảm thiểu pixel, nhưng "thay vào đó, nếu chuỗi có dấu nháy đơn, một lần nữa để thu nhỏ pixel. Tuy nhiên, đối với một chuỗi, tôi thích """hơn '''vì cái sau không chuẩn, không phổ biến và do đó đáng ngạc nhiên. Nếu bây giờ tôi có một chuỗi các chuỗi mà tôi đã sử dụng "theo logic trên, nhưng cũng là một chuỗi có thể thoát khỏi a ', tôi vẫn có thể sử dụng" nó để duy trì tính nhất quán, chỉ để giảm thiểu bất ngờ.

Có lẽ nó giúp nghĩ về triết lý tối thiểu hóa pixel theo cách sau. Bạn có muốn các ký tự tiếng Anh trông giống như A B Choặc AA BB CC? Lựa chọn thứ hai lãng phí 50% số pixel không trống.


-1

Tôi sử dụng dấu ngoặc kép vì tôi đã làm như vậy trong nhiều năm qua ở hầu hết các ngôn ngữ (C ++, Java, VB,) ngoại trừ Bash, bởi vì tôi cũng sử dụng dấu ngoặc kép trong văn bản bình thường và vì tôi đang sử dụng bàn phím không phải tiếng Anh (đã sửa đổi) cả hai ký tự đều yêu cầu phím shift.


-4

' = = "

/= \= =\\

thí dụ :

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ết quả giống nhau

= >> không, chúng không giống nhau. Một dấu gạch chéo ngược sẽ thoát khỏi các ký tự. Bạn chỉ xảy ra với may mắn trong đó ví dụ vì \k\wkhông thoát hợp lệ như \thoặc \nhoặc\\ hoặc\"

Nếu bạn muốn sử dụng dấu gạch chéo ngược đơn (và được giải thích như vậy), thì bạn cần sử dụng chuỗi "thô". Bạn có thể làm điều này bằng cách đặt một ' r' trước chuỗi

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

Đối với các đường dẫn trong Windows có liên quan, các dấu gạch chéo về phía trước được diễn giải theo cùng một cách. Rõ ràng bản thân chuỗi là khác nhau mặc dù. Tôi sẽ không đảm bảo rằng họ xử lý theo cách này trên một thiết bị bên ngoài.


Holy crap này đã cũ, nhưng dù sao tôi cũng muốn bình luận để chỉ ra rằng sử dụng dấu gạch chéo có thể hoạt động cho các cửa sổ nhưng vẫn phụ thuộc vào hệ thống. Để đảm bảo bạn không còn phụ thuộc vào os, hãy sử dụngos.path.join()
Adam Smith
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.