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


79

Tôi mới bắt đầu một công việc mà tôi đang viết Python sau khi đến từ nền Java và tôi nhận thấy rằng các nhà phát triển khác có xu hướng trích dẫn các chuỗi bằng cách sử dụng dấu ngoặc đơn ( '') thay vì dấu ngoặc kép ( ""). Ví dụ:

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

Có một lý do đặc biệt cho điều này ngoài sở thích cá nhân? Đây có phải là cách thích hợp để trích dẫn chuỗi? Cụ thể, những gì tôi muốn biết là nếu có một số loại tiêu chuẩn hoặc được chấp nhận thực hành tốt nhất thúc đẩy phong cách mã hóa này.


5
Nếu bạn đã từng tham gia Ruby, thực sự một sự khác biệt về kỹ thuật giữa dấu ngoặc đơn và dấu ngoặc kép. Dấu ngoặc kép hỗ trợ nội suy chuỗi - trích dẫn đơn phân tích thành chữ.
KChaloux

5
Điều này cũng đúng với Perl và hầu hết các shell.
Blrfl

18
Làm thế nào là câu hỏi này "không mang tính xây dựng"? Là một người mới bắt đầu trăn tuyệt đối, tôi cần biết điều này. Nếu bạn viết kịch bản bash, có một sự khác biệt lớn.
Magicsowon

19
Không mang tính xây dựng? Trời ạ. Kết quả google đầu tiên cho "dấu ngoặc kép đơn python", cho bạn biết những gì bạn cần biết nhanh chóng. Cảm ơn bạn đã hỏi Eric và trả lời gièm pha
aggieNick02

Câu trả lời:


65

Các câu trả lời khác đều đúng ở chỗ nó không có sự khác biệt về kỹ thuật, nhưng tôi đã thấy một quy tắc kiểu không chính thức trên một vài dự án nguồn mở: dấu ngoặc kép được sử dụng cho các chuỗi mà cuối cùng người dùng có thể nhìn thấy (dù chúng có cần hay không dịch) và các trích dẫn đơn dành cho các chuỗi liên quan đến chức năng của chính mã (ví dụ: khóa dict, biểu thức chính quy, SQL).

Đây chắc chắn không phải là một quy tắc phổ quát (hoặc thậm chí được mã hóa trong PEP), do đó, giống như bất kỳ khía cạnh tùy tiện nào khác của mã hóa, nó đi theo các quy tắc địa phương.

Lưu ý rằng PEP 8 (mà tôi đã không nhận thấy khi tôi viết câu trả lời này) nói :

PEP này không đưa ra khuyến nghị cho việc này. Chọn một quy tắc và tuân theo nó. Tuy nhiên, khi một chuỗi chứa các ký tự trích dẫn đơn hoặc kép, hãy sử dụng một ký tự khác để tránh dấu gạch chéo ngược trong chuỗi. Nó cải thiện khả năng đọc.

Như một nhà bình luận chỉ ra, điều này không nhất thiết là mâu thuẫn, tùy thuộc vào cách bạn diễn giải "quy tắc". Những gì tôi đề nghị không thực sự làm việc với nửa sau của trích dẫn.


1
Đây có thể là kiểu nhà, nhưng nó chống lại PEP 8: chọn một và sử dụng nó cho toàn bộ tệp, bất kể nội dung.
Nils von Barth

4
@NilsvonBarth PEP nói "chọn một quy tắc và tuân theo nó", chứ không phải "chọn một ký tự phân định và gắn bó với nó". "Dấu ngoặc kép cho văn bản hiển thị của người dùng, dấu ngoặc đơn cho những thứ được sử dụng bởi máy" có vẻ như là một quy tắc hoàn toàn tốt để tuân theo.
Tanner Swett

1
@Tanner Swett Xin lỗi, bạn nói đúng; đó là hướng dẫn kiểu Google Python chỉ định trong một tệp tin Google google.github.io/styleguide/pyguide.html# 310
Nils von Barth

Đen thực sự định dạng các chuỗi Python được bao quanh bởi dấu ngoặc kép. Ngay cả jslint cũng muốn các chuỗi JavaSciprt được bao quanh bởi các dấu ngoặc kép. Hầu hết các ngôn ngữ cũ thậm chí không bao giờ cung cấp tùy chọn. Chỉ vì bạn có thể làm điều đó không có nghĩa là bạn nên làm. Tất nhiên, có một vài trường hợp đây là một điều rất hay để có, như khi bạn có một trích dẫn trong chuỗi. Tuy nhiên, thực tế mà nói, hầu hết các chuỗi của bạn phải đến từ một tập dữ liệu không được mã hóa cứng trong cơ sở mã của bạn.
Bobort

1
@bobort Ngay cả khi bạn đang tìm kiếm chuỗi trong hệ thống dịch thuật hoặc giao diện người dùng, bạn vẫn thường cần các khóa chuỗi cho những người trong mã của mình. Nhưng tôi đồng ý rằng mọi thứ đã tiếp tục và thực sự không có lợi ích gì cho sự khác biệt này.
gièm pha

21

Nó rất đơn giản:

  • Dấu ngoặc đơn cho phép nhúng dấu ngoặc kép không thoát.
  • Dấu ngoặc kép cho phép nhúng các dấu ngoặc đơn không thoát.

Đó là hầu hết Pythonic để sử dụng '(dấu ngoặc đơn) cho đến khi bạn cần dấu ngoặc kép.

Các trích dẫn sau đây là trực tiếp từ các tài liệu về chuỗi ký tự.

có sẵn trong chuỗi Unicode. Tiền tố của 'b' hoặc 'B' bị bỏ qua trong Python 2; nó chỉ ra rằng chữ sẽ trở thành một byte bằng chữ trong Python 3 (ví dụ: khi mã được tự động chuyển đổi với 2to3). Tiền tố 'u' hoặc 'b' có thể được theo sau bởi tiền tố 'r'.

Trong các chuỗi ba trích dẫn, các dòng mới và trích dẫn không được phép được cho phép (và được giữ lại), ngoại trừ ba trích dẫn không được trích dẫn trong một hàng chấm dứt chuỗi. (Một trích dẫn của người Viking là ký tự được sử dụng để mở chuỗi, tức là 'hoặc ".)


15
Câu hỏi tất nhiên là - tại sao Pythonic lại thích trích dẫn đơn hơn khi hầu hết mọi ngôn ngữ khác đều sử dụng dấu ngoặc kép?
Martin Beckett

13
@MartinBeckett

3
Tất nhiên rồi ;-)
Martin Beckett

6
@JarrodRoberson: Tôi nghĩ "bởi vì" (hoặc "bởi vì", nếu bạn muốn) là một câu trả lời hợp lệ nếu nó được viết bằng một số PEP (hoặc tương tự) rằng đó là cách của Pythonic . Nếu không, đó chỉ là sự lựa chọn cá nhân.
Joachim Sauer

5
dấu ngoặc đơn trông gọn gàng hơn và cũng không cần phím shift để gõ
JoelFan

17

Từ góc độ kỹ thuật, nó không có gì khác biệt, từ góc độ phong cách một vài suy nghĩ:

  • Hầu hết các ngôn ngữ lập trình khác sử dụng dấu ngoặc kép.
  • Khi viết bằng tiếng Anh thường sử dụng dấu ngoặc kép.
  • Dấu ngoặc đơn hữu ích khi bạn có nhiều văn bản phi kỹ thuật / tường thuật trong ứng dụng của mình vì chúng cho phép bạn sử dụng dấu ngoặc kép theo cách tự nhiên hơn. bar = '"It\'s awesome" he said.'
  • Mặt khác, ký tự trích dẫn đơn cũng được sử dụng trong một vài lần trong ngôn ngữ tiếng Anh. bar = "\"It's awesome\" he said."

Lưu ý rằng "thường được sử dụng trong các chuỗi kỹ thuật, quá -e, g f'you đã gửi" {dumb_thing} nhưng điều đó quá ngu ngốc ngay cả đối với chúng tôi! '
Christian Sauer

4

Không có sự khác biệt giữa việc sử dụng dấu ngoặc đơn và dấu ngoặc kép trong Python. Trong điều kiện thực tế, tùy thuộc vào loại dữ liệu bạn đang làm việc, bạn có thể tìm thấy một hoặc kiểu khác thuận tiện hơn.

Loại trích dẫn được sử dụng "theo mặc định" (trong đó không có lý do thuyết phục để sử dụng cái này hay cái khác) là vấn đề sở thích cá nhân.

Để biết thêm thông tin, hãy xem phần về Chuỗi ký tự trong tài liệu Python.


4

Một số điều cần xem xét khi phát triển thói quen của bạn về việc nên sử dụng dấu ngoặc đơn hay kép thường xuyên.

Dấu ngoặc kép đòi hỏi hai phím ngón tay; và do đó nhiều khả năng cho lỗi đánh máy cũng như giảm tốc độ

Trình chỉnh sửa của bạn có thể hiển thị một ký tự tốt hơn một ký tự khác; để gỡ lỗi cú pháp trực quan dễ dàng hơn.

Tài liệu sử dụng ba ký tự: Cái nào trông đẹp hơn? """""" hoặc là ''''''

Mặc dù tôi chưa thấy điều này trên HĐH Windows, một số công cụ tài liệu hoặc cú pháp có thể mong đợi các trích dẫn đơn câu thơ đôi.

Đối với hầu hết các hướng dẫn Python tôi đã thấy tôi thấy điều ngược lại với trải nghiệm của bạn. Tôi thường thấy dấu ngoặc kép được sử dụng.


4

Theo ý kiến ​​của tôi, tôi thích sử dụng dấu ngoặc kép cho một chuỗi.

Tại sao? Đối với các lập trình viên của các ngôn ngữ khác có thể được điều chỉnh nhanh chóng và hiểu mã dễ dàng hơn.

Nếu một lập trình viên C thấy:

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

Sẽ do dự, thay vì:

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

3
"Viết \" Nó lớn không? \ "Không."
API-Beast

@Lucio Đó là những gì tôi đã làm, tôi chỉ không biết liệu mình có vi phạm một số loại tiêu chuẩn Python đã được thiết lập hay không.
Eric Hydrick

@EricHydrick Không, bạn có thể chọn cái này hoặc cái khác.
Lucio
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.