Quy ước đặt tên trong Python cho tên biến và hàm là gì?


773

Đến từ nền C #, quy ước đặt tên cho các biến và tên phương thức thường là camelCase hoặc PascalCase:

// C# example
string thisIsMyVariable = "a"
public void ThisIsMyMethod()

Trong Python, tôi đã thấy ở trên nhưng tôi cũng đã thấy dấu gạch dưới được sử dụng:

# python example
this_is_my_variable = 'a'
def this_is_my_function():

Có một phong cách mã hóa dứt khoát, thích hợp hơn cho Python không?

Câu trả lời:


867

Xem Python PEP 8: Tên hàm và biến :

Tên hàm nên được viết thường, với các từ được phân tách bằng dấu gạch dưới khi cần thiết để cải thiện khả năng đọc.

Tên biến theo cùng quy ước như tên hàm.

mixCase chỉ được phép trong các bối cảnh nơi đó đã là kiểu thịnh hành (ví dụ: threading.py ), để duy trì khả năng tương thích ngược.


127
PEP = Đề xuất cải tiến Python.
Peter Mortensen

8
@RickyRobinson Bạn đang sử dụng trình soạn thảo mã chết não nào, điều đó không biết rằng dấu gạch dưới tiếp tục một từ? Rất nhiều cái miễn phí mà làm. Tôi sử dụng Notepad ++, nếu IDE không có sẵn. Đối với điều đó, có thể tải xuống một mẫu để chỉnh sửa python. (Những người khác có thể đề xuất các bản tải xuống miễn phí hữu ích hơn nữa.)
ToolmakerSteve 16/12/13

57
Một trường hợp cho phong cách thiếu chú ý là bạn có thể sử dụng các từ một chữ cái tốt hơn. Đối với (một ví dụ khá ngớ ngẩn), findMeAClasscó lẽ xấu hơn find_me_a_class.
heltonbiker

9
Tôi thấy rằng quy ước của các tên biến chữ thường không phù hợp trong điện toán khoa học, trong đó người ta thường bắt gặp các hằng số nổi tiếng, tenxơ v.v ... được ký hiệu bằng chữ in hoa.
andreasdr

12
@rr PEP8 là "Hướng dẫn về Phong cách" và tự mô tả là Công ước, KHÔNG phải là Tiêu chuẩn. Nó cũng giải thích rõ ràng lý do không phải lúc nào cũng tuân theo những "quy tắc" đó.
Tahaan

710

Các Google Python Style Guide có quy ước sau:

module_name, package_name, ClassName, method_name, ExceptionName, function_name, GLOBAL_CONSTANT_NAME, global_var_name, instance_var_name, function_parameter_name, local_var_name.

Một kế hoạch đặt tên tương tự nên được áp dụng cho một CLASS_CONSTANT_NAME


37
a) Tôi thích các ví dụ - cảm ơn. b) Hỗn hợp không hấp dẫn của CamelCase và dấu gạch dưới? Nhưng: Là người mới đối với Python và mô hình dữ liệu linh hoạt hơn của nó, tôi cá rằng có suy nghĩ vững chắc đằng sau hướng dẫn của Google ...
Matthew Cornell

19
@MatthewCornell trộn không tệ miễn là bạn dính vào nó. Nó thực sự làm cho dễ đọc hơn nếu bạn biết rằng các hàm có dấu gạch dưới và các lớp không.
Pithikos

1
@MatthewCornell Tôi không cho rằng nó có liên quan gì đến trăn. Go thực sự thực thi các tiêu chuẩn về cái đẹp tùy ý và sẽ không biên dịch nếu bạn không tuân thủ, ví dụ, quy ước niềng răng xoăn của họ. Về cơ bản, đó là một trò súc sắc về việc ai đó thực sự có suy nghĩ cẩn thận hay chỉ thực sự yêu cách họ làm việc.
Bắn Parthian

Bạn có xem xét thuộc tính tĩnh không đổi là GLOBAL_CONSTANT_NAME không? Nó không chính xác toàn cầu như trong phạm vi của lớp.
James T.

sau đó bước vào property... có lẽ đó là vấn đề của món đồ đang giả vờ, hơn là nó thực sự là gì
tham gia

240

David Goodger (trong "Code Like a Pythonista" ở đây ) mô tả các đề xuất PEP 8 như sau:

  • joined_lower cho các hàm, phương thức, thuộc tính, biến

  • joined_lowerhoặc ALL_CAPScho hằng số

  • StudlyCaps cho các lớp học

  • camelCase chỉ để phù hợp với các công ước đã có từ trước


3
+1 ví dụ trực quan. Mặc dù tôi không thể thấy PEP8 gợi ý joined_lowercác hằng số ở đâu , chỉ "tất cả các chữ in hoa có dấu phân cách từ". Tò mò cũng về tính năng enum mới .
Bob Stein

1
StudlyCaps for classeslà một quy tắc phổ quát tuyệt vời cho các lớp học trong hầu hết các ngôn ngữ. Vậy thì tại sao một số lớp trăn tích hợp (chẳng hạn như datetime.datetimekhông tuân theo quy ước này?
Prahlad Yeri

3
@PrahladYeri: Thật không may, unittest.TestCase.assertEqualvà bạn bè cũng không tuân theo quy ước sn_case. Sự thật là các phần của thư viện chuẩn Python đã được phát triển trước khi các quy ước được củng cố, và chúng ta hiện đang bị mắc kẹt với chúng.
wchargein

3
CamelCase khó hiểu vì một số người nói đó là "camelCase" (còn được gọi là "hỗn hợp") và một số người nói đó là "CamelCase" (còn được gọi là "StudlyCaps"). Ví dụ: PEP đề cập đến "CamelCase" trong khi bạn đề cập đến "camelCase".
Pro Q

liên kết ở đây của bạn đã chết, có lẽ nó nên được thay thế bằng một cái gì đó như david.goodger.org/projects/pycon/2007/idiomatic
Wolf

42

Như Hướng dẫn về Phong cách cho Mã Python thừa nhận,

Các quy ước đặt tên của thư viện Python là một mớ hỗn độn, vì vậy chúng tôi sẽ không bao giờ có được điều này hoàn toàn nhất quán

Lưu ý rằng điều này chỉ liên quan đến thư viện tiêu chuẩn của Python . Nếu họ không thể có được sự nhất quán đó, thì hầu như không có nhiều hy vọng có một quy ước được tuân thủ chung cho tất cả các mã Python, phải không?

Từ đó và thảo luận ở đây, tôi sẽ suy luận rằng đó không phải là một tội lỗi khủng khiếp nếu người ta cứ sử dụng các quy ước đặt tên của Java hoặc C # (rõ ràng và được thiết lập tốt) cho các biến và hàm khi chuyển qua Python. Tất nhiên, hãy nhớ rằng tốt nhất là tuân theo bất cứ phong cách phổ biến nào cho một codebase / dự án / nhóm xảy ra. Như Hướng dẫn về Phong cách Python chỉ ra, tính nhất quán bên trong là quan trọng nhất.

Hãy loại bỏ tôi như một kẻ dị giáo. :-) Giống như OP, dù sao tôi cũng không phải là "Pythonista".


32

PEP 8 , như các câu trả lời khác cho thấy, nhưng PEP 8 chỉ là phong cách cho thư viện tiêu chuẩn và nó chỉ được coi là phúc âm trong đó. Một trong những sai lệch thường gặp nhất của PEP 8 đối với các đoạn mã khác là cách đặt tên biến, đặc biệt cho các phương thức. Không có kiểu chiếm ưu thế duy nhất, mặc dù xem xét khối lượng mã sử dụng hỗn hợp, nếu một người thực hiện một điều tra dân số nghiêm ngặt, người ta có thể sẽ kết thúc bằng một phiên bản PEP 8 với hỗn hợp. Có rất ít sai lệch khác so với PEP 8 khá phổ biến.


9
Điều này có thể đúng trong năm 08 khi điều này được trả lời, nhưng ngày nay hầu như tất cả các thư viện lớn đều sử dụng quy ước đặt tên PEP 8.
Thane Brimhall

28

Như đã đề cập, PEP 8 nói sẽ sử dụng lower_case_with_underscorescho các biến, phương thức và hàm.

Tôi thích sử dụng lower_case_with_underscorescho các biến và mixedCasecho các phương thức và hàm làm cho mã rõ ràng và dễ đọc hơn. Do đó, theo Zen "của Python là tốt hơn so với ngầm" và "Số lượng khả năng đọc"


3
+1 Tôi chuyển đổi hai cái đó (tôi sử dụng hỗn hợp cho các biến), nhưng có mọi thứ khác biệt hơn như thế sẽ giúp làm rõ ngay những gì bạn đang xử lý, đặc biệt là khi bạn có thể chuyển qua các hàm.
Xiong Chiamiov

2
Mặc dù "Khả năng đọc" rất chủ quan. Tôi tìm thấy các phương pháp với gạch dưới dễ đọc hơn.
Pithikos

Sở thích của bạn là trực giác ban đầu của tôi đến từ nhiều năm phát triển Java. Tôi thích sử dụng _ cho các biến, nhưng từ đôi mắt, nó trông hơi buồn cười đối với các hàm và phương thức.
Michael Szczepaniak

21

hơn nữa với những gì @JohnTESlade đã trả lời. Hướng dẫn phong cách python của Google có một số đề xuất khá gọn gàng,

Tên cần tránh

  • tên nhân vật duy nhất ngoại trừ bộ đếm hoặc lặp
  • dấu gạch ngang (-) trong bất kỳ tên gói / mô-đun nào
  • \__double_leading_and_trailing_underscore__ names (được bảo lưu bởi Python)

Quy ước đặt tên

  • "Internal" có nghĩa là nội bộ cho một mô-đun hoặc được bảo vệ hoặc riêng tư trong một lớp.
  • Chuẩn bị một dấu gạch dưới đơn (_) có một số hỗ trợ để bảo vệ các biến và chức năng của mô-đun (không bao gồm nhập * từ). Chuẩn bị một dấu gạch dưới kép (__) cho một biến đối tượng hoặc phương thức phục vụ hiệu quả để biến biến hoặc phương thức thành riêng tư đối với lớp của nó (sử dụng xáo trộn tên).
  • Đặt các lớp liên quan và các hàm cấp cao nhất với nhau trong một mô-đun. Không giống như Java, không cần giới hạn bản thân trong một lớp cho mỗi mô-đun.
  • Sử dụng CapWordscho tên lớp, nhưng lower_with_under.pycho tên mô-đun. Mặc dù có nhiều mô-đun hiện có được đặt tên CapWords.py, nhưng điều này hiện không được khuyến khích vì thật khó hiểu khi mô-đun xảy ra được đặt tên theo một lớp. ("chờ đã - tôi đã viết import StringIOhay from StringIO import StringIOchưa?")

Nguyên tắc bắt nguồn từ Khuyến nghị của Guido nhập mô tả hình ảnh ở đây


17

Hầu hết những người dùng trăn đều thích quần lót, nhưng ngay cả tôi cũng đang sử dụng python từ hơn 5 năm nay, tôi vẫn không thích chúng. Chúng trông thật xấu xí đối với tôi, nhưng có lẽ đó là tất cả Java trong đầu tôi.

Tôi chỉ đơn giản như CamelCase tốt hơn vì nó phù hợp hơn với cách lớp học được đặt tên, Nó cảm thấy hợp lý hơn để có SomeClass.doSomething()hơn SomeClass.do_something(). Nếu bạn nhìn xung quanh chỉ số mô-đun toàn cầu bằng python, bạn sẽ tìm thấy cả hai, đó là do thực tế đó là một tập hợp các thư viện từ nhiều nguồn phát triển ngoài giờ và không phải là thứ được phát triển bởi một công ty như Sun với các quy tắc mã hóa nghiêm ngặt . Tôi muốn nói điểm mấu chốt là: Sử dụng bất cứ thứ gì bạn thích hơn, đó chỉ là một câu hỏi về sở thích cá nhân.


10
Tôi đến từ một nền tảng Java và tôi thấy nhấn mạnh dài dòng và không hấp dẫn, chỉ có ý kiến ​​sau. Đặt tên ở một số khía cạnh là sự cân bằng giữa khả năng đọc và ngắn gọn. Unix đi quá xa, nhưng en.wikipedia.org/wiki/Domain-specific_lingu của nó bị hạn chế. CamelCase có thể đọc được do mũ, nhưng không có thêm ký tự. 2c
Matthew Cornell

2
Đối với tôi, dấu gạch dưới rất hấp dẫn trong các hàm / phương thức vì tôi thấy mọi dấu gạch dưới là dấu phân cách cho một không gian tên ảo (trong đầu tôi). Bằng cách đó tôi có thể dễ dàng biết làm thế nào để đặt tên cho các chức năng mới của tôi / phương pháp: make_xpath_predicate, make_xpath_expr, make_html_header,make_html_footer
Pithikos

3
Bạn không (thường) gọi SomeClass.doSomething()(phương thức tĩnh thường rất hiếm) bạn thường gọian_instance.do_something()
Dave

15

Cá nhân tôi cố gắng sử dụng CamelCase cho các lớp, các phương thức và hàm hỗn hợp. Các biến thường được phân tách bằng dấu gạch dưới (khi tôi có thể nhớ). Bằng cách này tôi có thể nói trong nháy mắt chính xác những gì tôi đang gọi, hơn là mọi thứ trông giống nhau.


15
Vỏ lạc đà bắt đầu bằng một chữ cái viết thường IIRC như "camelCase".
UnkwnTech

11
Tôi nghĩ rằng Crystalattice đã đúng - ít nhất, cách sử dụng của anh ta phù hợp với cách sử dụng trong PEP8 (CamelCase và hỗn hợpCase).
Jarrett

1
@UnkwnTech Thuật ngữ cho FirstLetterUpper đôi khi được gọi là PascalCase
SurpriseDog

CamelCase hay lạc đà? chỉ cần.
Sumit Pokhrel

11

Có một bài viết về điều này: http://www.cs.kent.edu/~jmaletic/ con / ICPC2010-CamelCaseUnderScoreClouds.pdf

TL; DR Nó nói rằng Snake_case dễ đọc hơn camelCase. Đó là lý do tại sao các ngôn ngữ hiện đại sử dụng (hoặc nên sử dụng) con rắn bất cứ nơi nào chúng có thể.


9
Điều thú vị là, nó cũng cho biết, "Kết quả của nghiên cứu này có thể không nhất thiết phải áp dụng cho các mã định danh được nhúng trong mã nguồn. Hoàn toàn có khả năng các mã định danh có thể hoạt động như một yếu tố cử động tốt hơn khi được nhúng trong các cấu trúc lập trình."
rob3c

2

Kiểu mã hóa thường là một phần của các tiêu chuẩn chính sách / quy ước nội bộ của một tổ chức, nhưng tôi nghĩ nói chung, kiểu all_lower_case_underscore_separator (còn gọi là Snake_case) là phổ biến nhất trong python.


0

Cá nhân tôi sử dụng các quy ước đặt tên của Java khi phát triển bằng các ngôn ngữ lập trình khác vì nó phù hợp và dễ làm theo. Bằng cách đó, tôi không tiếp tục đấu tranh về việc sử dụng những quy ước nào không phải là phần khó nhất trong dự án của tôi!


Tôi phần nào đồng ý. Nếu ngôn ngữ X chỉ là một phần nhỏ của dự án, thì việc chuyển đổi ngữ cảnh về cách định dạng văn bản có thể là một gánh nặng. Nấc chính là các thư viện sẽ có các cuộc gọi theo một kiểu ( library_function(my_arg)).
Lan

-2

Thông thường, người ta tuân theo các quy ước được sử dụng trong thư viện tiêu chuẩn của ngôn ngữ.

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.