"Idiomatic python" có nghĩa là viết code theo cách mà cộng đồng Python cho rằng code nên được viết như vậy. Ai là người quyết định code nên được viết như thế nào? Tất nhiên là tất cả những người phát triển Python, thông qua code của họ đã làm nên cái gì gọi là idiomatic. Đó cũng là nội dung sẽ được trình bày trong bài viết này. Người thực sự quyết định trong một số trường hợp là BDFL [Guido] hoặc PEP.
Bạn chưa biết gì về pythonic code? Không sao, trong bài viết này sẽ trình bày cho bạn một số khái niệm cơ bản, giúp chúng ta viết code Python một cách chuyên nghiệp và "Pythonic" nhất.
Cấu trúc điều khiển và hàm
Lệnh if
Tránh việc so sánh trực tiếp với True
, False
hoặc None
Với mỗi đối tượng, luôn luôn có sẵn hoặc bạn có thể định nghĩa "đúng-sai" cho nó. Việc kiểm tra một điều kiện là đúng hay sai phụ thuộc vào định nghĩa đúng-sai của những đối tượng này. Việc định nghĩa đúng-sai rất đơn giản, tất cả những điều sau đều được coi là sai [False
]
None
False
0
cho dữ liệu số- một chuỗi rỗng [xâu rỗng, list rỗng, tuple rỗng, set rỗng]
- dictionary rỗng
- kết quả
0
hoặcNone
được trả về bởi các phương thứcTrue
0 hoặcTrue
1
Điều kiện cuối cùng, cho phép chúng ta có thể tự định nghĩa đúng-sai cho các đối tượng thông qua các phương thức True
0 hoặc True
1.
Tất cả các kết quả khác với kết quả ở trên đều được coi là đúng [True
]. Câu lệnh if
sử dụng đúng-sai và bạn nên sử dụng đúng-sai của chính các đối tượng. Ví dụ, thay vì so sánh:
Bạn chỉ cần kiểm tra như sau là đủ:
Có nhiều lý do để làm việc này. Lý do dễ nhìn thấy nhất là cho dù code của bạn có thay đổi, True
6 có thể nhận giá trị True
7 thay vì chỉ True
hay False
thì code của bạn vẫn hoạt động bình thường.
Ở một mức độ sâu hơn, thì lý do để làm việc này liên quan đến False
0 và False
1. Sử dụng phép so sánh False
2 sẽ so sánh xem hai đối tượng có cùng giá trị hay không [được định nghĩa ở thuộc tính False
3]. Sử dụng False
4 sẽ so sánh xem hai đối tượng có phải là một hay không.hai đối tượng có phải là một hay không.
Lưu ý rằng, có một số trường hợp,
False
4 hoạt động giống như làFalse
2, tuy nhiên đây chỉ là những trường hợp đặc biệt và bạn không nên tin tưởng chúng.
Kết quả là bạn nên tránh việc so sánh trực tiếp với những giá trị như False
, None
hay những chuỗi rỗng như False
9, None
0, None
1. Nếu một biến None
2 mà rỗng thì điều kiện None
3 sẽ cho kết quả là False
.
Tuy nhiên, có một số trường hợp, việc so sánh với None
được recommend nhưng không bắt buộc. Một hàm cần kiểm tra xem tham số có giá trị mặc định là None
đã thực sự được truyền giá trị vào hay chưa, thì việc so sánh với None
là cần thiết. Ví dụ:recommend nhưng không bắt buộc. Một hàm cần kiểm tra xem tham số có giá trị mặc định là None
đã thực sự được truyền giá trị vào hay chưa, thì việc so sánh với None
là cần thiết. Ví dụ:
Điều gì xảy ra nếu chúng ta sử dụng None
8? Nếu một người muốn điền giá trị vào vị trí 0
thì hàm của chúng ta sẽ hoạt động như là giá trị position chưa được truyền vào vì 0
cũng được coi là sai.
Lưu ý rằng, ở ví dụ trên chúng ta sử dụng False
1. Việc so sánh với None
[singleton trong Python] luôn luôn phải sử dụng False
4 hoặc False
1 chứ không sử dụng False
2 [PEP 8].
Hãy sử dụng giá trị đúng-sai của các đối tượng trong các lệnh kiểm tra điều kiện.
Harmful
Idiomatic
Tránh việc lặp đi lặp lại biến trong lệnh if
Khi bạn muốn kiểm tra một biến với nhiều giá trị trong một lệnh, việc lặp đi lặp lại biến trong phải là một cách hay. Hãy sử dụng một "iterable" sẽ giúp code của bạn sáng sủa và dễ đọc hơn.
Harmful
Idiomatic
Tránh việc lặp đi lặp lại biến trong lệnh if
Khi bạn muốn kiểm tra một biến với nhiều giá trị trong một lệnh, việc lặp đi lặp lại biến trong phải là một cách hay. Hãy sử dụng một "iterable" sẽ giúp code của bạn sáng sủa và dễ đọc hơn.
Harmful
Idiomatic
Tránh việc lặp đi lặp lại biến trong lệnh if
Khi bạn muốn kiểm tra một biến với nhiều giá trị trong một lệnh, việc lặp đi lặp lại biến trong phải là một cách hay. Hãy sử dụng một "iterable" sẽ giúp code của bạn sáng sủa và dễ đọc hơn.
Tránh việc sử dụng lệnh con của câu điều kiện cùng dòng với dấu hai chấm
Hãy sử dụng indent để phân biệt các khối lệnh [giống như code ở tất cả những chỗ khác]. Điều đó giúp chúng ta dễ dàng hiểu được những gì được gọi ở các điều kiện khác nhau. Các lệnh if
, False
8 hay False
9 nên ở riêng một dòng và không có lệnh nào ở sau None
0.
Harmful
Idiomatic
Tránh việc lặp đi lặp lại biến trong lệnh if
Khi bạn muốn kiểm tra một biến với nhiều giá trị trong một lệnh, việc lặp đi lặp lại biến trong phải là một cách hay. Hãy sử dụng một "iterable" sẽ giúp code của bạn sáng sủa và dễ đọc hơn.
Harmful
Idiomatic
Tránh việc lặp đi lặp lại biến trong lệnh if
Khi bạn muốn kiểm tra một biến với nhiều giá trị trong một lệnh, việc lặp đi lặp lại biến trong phải là một cách hay. Hãy sử dụng một "iterable" sẽ giúp code của bạn sáng sủa và dễ đọc hơn.
Trong tình huống dưới đây, chúng ta cần kiểm tra email được các user đăng ký có gì bất thường hay không? Code idiomatic dễ hiểu hơn rất nhiều và không cần dùng đến flag False
6. Đây cũng là ví dụ rất tốt để làm quen với False
7.
Harmful
Idiomatic
Hàm
Tránh sử dụng False
8, False
9 và None
0 làm giá trị mặc định cho tham số
Việc này đã được đề cập khá nhiều trong các tutorial của Python. Nói ngắn gọn lại là chúng ta nên sử dụng 0
1 thay vì 0
2 làm giá trị mặc định của các tham số. Minh hoạ dưới đây sẽ giải thích rõ hơn tại sao?
Harmful
Idiomatic
Hàm
Tránh sử dụng False
8, False
9 và None
0 làm giá trị mặc định cho tham số
Việc này đã được đề cập khá nhiều trong các tutorial của Python. Nói ngắn gọn lại là chúng ta nên sử dụng 0
1 thay vì 0
2 làm giá trị mặc định của các tham số. Minh hoạ dưới đây sẽ giải thích rõ hơn tại sao?
Harmful
Idiomatic
Hàm
Tránh sử dụng False
8, False
9 và None
0 làm giá trị mặc định cho tham số
Việc này đã được đề cập khá nhiều trong các tutorial của Python. Nói ngắn gọn lại là chúng ta nên sử dụng 0
1 thay vì 0
2 làm giá trị mặc định của các tham số. Minh hoạ dưới đây sẽ giải thích rõ hơn tại sao?
Sử dụng 0
3 và 0
4 để nhận tham số với số lượng tùy ý
Nhiều khi các hàm cần nhận vào nhiều tham số với số lượng không biết trước, hàm có thể chỉ sử dụng một vài tham số và truyền tham số cho các hàm tiếp theo. Việc sử dụng 0
3 và 0
4 cho phép chúng ta tạo ra một hàm có thể nhận tham số với số lượng tuỳ ý.
Harmful
Idiomatic
Hàm
Tránh sử dụng False
8, False
9 và None
0 làm giá trị mặc định cho tham số
Harmful
Idiomatic
Việc này đã được đề cập khá nhiều trong các tutorial của Python. Nói ngắn gọn lại là chúng ta nên sử dụng 0
1 thay vì 0
2 làm giá trị mặc định của các tham số. Minh hoạ dưới đây sẽ giải thích rõ hơn tại sao?
Sử dụng 0
3 và 0
4 để nhận tham số với số lượng tùy ý
Nhiều khi các hàm cần nhận vào nhiều tham số với số lượng không biết trước, hàm có thể chỉ sử dụng một vài tham số và truyền tham số cho các hàm tiếp theo. Việc sử dụng 0
3 và 0
4 cho phép chúng ta tạo ra một hàm có thể nhận tham số với số lượng tuỳ ý.
Harmful
Idiomatic
Việc này cũng rất hữu ích khi chúng ta phát triển những API nhưng cần tương thích ngược với những phiên bản cũ. Nếu hàm chấp nhận tham số tuỳ ý, chúng ta có thể thêm vào các tham số mới mà không làm ảnh hưởng đến những phiên bản cũ sử dụng ít tham số hơn. Nếu có tài liệu tốt, mọi thứ sẽ rất trơn tru.
Làm việc với dữ liệu
Harmful
Idiomatic
List
Sử dụng list comprehension để tạo list mới từ list đã có
Sử dụng list comprehension sẽ làm gắn gọn việc tạo list mới từ những list đã có. Điều này đặc biệt đúng nếu chúng ta vừa chuyển thể list vừa kiểm tra một số điều kiện.
Ngoài ra có nhiều lợi ích từ việc sử dụng list comprehension [và biến thể của nó, biểu thức generator] liên quan đến hiệu suất bởi vì trình thông dịch đã được tối ưu hoá cho việc này.
Idiomatic
Sử dụng toán tử 0
7 đại diện cho "phần còn lại" của list
Rất nhiều trường hợp, nhất là với những tham số tuỳ ý của một hàm, chúng ta cần lấy ra phần tử đầu tiên [hoặc cuối cùng] của list và giữ nguyên phần còn lại. Python 2 không có cách dễ dàng để làm việc này ngoài cách cắt list ra như ví dụ dưới đây. Nhưng Python 3 có toán tử 0
7 giúp chúng ta trong trường hợp như vậy.
Harmful
Idiomatic
Dictionary
Sử dụng tham số 0
9 của 0
0 để đặt giá trị mặc địnhkhông quá 3 hàm liên tiếp là một quy ước tốt.
Harmful
Idiomatic
Tham số 0
9 của 0
0 thường xuyên bị bỏ quên. Nếu không sử dụng tham số này [hoặc class 0
3] code của bạn sẽ khá rắc rối với một vài lệnh if
.
Sử dụng dict comprehension để xây dựng dict rõ ràng và hiệu quả
List comprehension của Python thường được biết đến nhiều hơn là dict comprehension. Mục đích của chúng giống nhau: đó là xây dựng dict mới từ dict cũ một cách dễ dàng với cú pháp "comprehension".
Những điều dưới đây là quy ước, và thường được sử dụng rộng rãi.
Thứ nhất, những thuộc tính "protected" nghĩa là chúng không được dùng trực tiếp từ bên ngoài, sẽ bắt đầu bằng 1 dấu gạch dưới. Thứ hai, những thuộc tính "private", tức là chúng không được truy cấp từ các class con kế thừa từ class cha, sẽ bắt đầu bằng 2 dấu gạch dưới. Tất nhiên, có nhiều biến thể khác nhau của quy ước trên. Và tất cả chỉ là quy ước và các developer ngầm hiểu với nhau. Chứ thực ra, mọi thuộc tính của class đều là "public" và không gì có thể thay đổi điều đó. Nhưng những quy ước này đang được sử dụng rộng rãi, và bạn nên tôn trọng nó.
Tôi nghĩ rằng chúng ta nên sử dụng quy ước trên, thay vì chỉ dùng 1 dấu gạch dưới cho mọi thuộc tính "private". Ít người để ý rằng, việc thêm những tiền tố vào tên cũng có một số ý nghĩa nhất định. Ví dụ, thêm 1 dấu gạch dưới sẽ làm cho đối tượng không được import khi chúng ta dùng cú pháp "all" [None
3]. Thêm 2 dấu gạch dưới vào thuộc tính cũng liên quan đến việc chia cắt tên của Python. Nó có một tác dụng là các class con sẽ không thay thế thuộc tính đó một cách không lường trước. Nếu trong class None
4 chúng ta định nghĩa None
5 thì nó sẽ được "chia cắt" thành None
6.
Harmful
Idiomatic
Định nghĩa phương thức None
7 để hiển thị class dễ hiểu hơn
Khi định nghĩa một class mà nó được sử dụng với hàm None
8, thì mặc định Python sẽ in ra một số thông tin không được thiết thực cho lắm. Bằng cách định nghĩa phương thức None
7, bạn có thể thay đổi việc gọi hàm True
00 với các đối tượng của class theo cách mà bạn muốn.
Harmful
Idiomatic
Định nghĩa phương thức None
7 để hiển thị class dễ hiểu hơn
Khi định nghĩa một class mà nó được sử dụng với hàm None
8, thì mặc định Python sẽ in ra một số thông tin không được thiết thực cho lắm. Bằng cách định nghĩa phương thức None
7, bạn có thể thay đổi việc gọi hàm True
00 với các đối tượng của class theo cách mà bạn muốn.
Setkhác nhau, chúng ta có thể sử dụng tập hợp. Ba thuộc tính của tập hợp [set] khiến chúng thích hợp nhất cho bài toán này:
- Sử dụng tập hợp để tránh các dữ liệu lặp lại
- Với list và dict, thì chúng ta thường xuyên gặp các giá trị bị lặp lại. Trong list của họ các nhân viên trong một công ty lớn, chúng ta cần tìm ra những họ phổ biến [xuất hiện nhiều lần trong list]. Nếu chúng ta cần liệt kê những họ khác nhau, chúng ta có thể sử dụng tập hợp. Ba thuộc tính của tập hợp [set] khiến chúng thích hợp nhất cho bài toán này:
- Set chỉ lưu các phần tử 1 lần duy nhất
Thêm một giá trị đã có vào set, giá trị này sẽ bị bỏ qua
Một set có thể được tạo ra từ các "iterable" một cách dễ dàng
Harmful
Idiomatic
Định nghĩa phương thức None
7 để hiển thị class dễ hiểu hơn
Khi định nghĩa một class mà nó được sử dụng với hàm None
8, thì mặc định Python sẽ in ra một số thông tin không được thiết thực cho lắm. Bằng cách định nghĩa phương thức None
7, bạn có thể thay đổi việc gọi hàm True
00 với các đối tượng của class theo cách mà bạn muốn.
Set
Idiomatic
Định nghĩa phương thức None
7 để hiển thị class dễ hiểu hơn
Khi định nghĩa một class mà nó được sử dụng với hàm None
8, thì mặc định Python sẽ in ra một số thông tin không được thiết thực cho lắm. Bằng cách định nghĩa phương thức None
7, bạn có thể thay đổi việc gọi hàm True
00 với các đối tượng của class theo cách mà bạn muốn.
Set
Sử dụng tập hợp để tránh các dữ liệu lặp lại
- Với list và dict, thì chúng ta thường xuyên gặp các giá trị bị lặp lại. Trong list của họ các nhân viên trong một công ty lớn, chúng ta cần tìm ra những họ phổ biến [xuất hiện nhiều lần trong list]. Nếu chúng ta cần liệt kê những họ khác nhau, chúng ta có thể sử dụng tập hợp. Ba thuộc tính của tập hợp [set] khiến chúng thích hợp nhất cho bài toán này:
- Set chỉ lưu các phần tử 1 lần duy nhất
- Thêm một giá trị đã có vào set, giá trị này sẽ bị bỏ qua
- Một set có thể được tạo ra từ các "iterable" một cách dễ dàng
Trở lại với ví dụ của chúng ta, giả sử chúng ta đã định nghĩa hàm True
01 để hiển thị các phần tử của một chuỗi. Liệu chúng ta có cần thay đổi hàm này nếu chuyển từ list sang dùng set.hãy sử dụng set.
Tất nhiên là không? Nếu hàm True
01 được định nghĩa đúng, chúng ta chỉ cần thay list thành set là được. Đó là bởi vì, set cũng giống như list, đều là "iterable" và chúng ta có thể sử dụng vòng lặp None
1, cú pháp comprehension, v.v...
Set
Idiomatic
Định nghĩa phương thức None
7 để hiển thị class dễ hiểu hơn
Khi định nghĩa một class mà nó được sử dụng với hàm None
8, thì mặc định Python sẽ in ra một số thông tin không được thiết thực cho lắm. Bằng cách định nghĩa phương thức None
7, bạn có thể thay đổi việc gọi hàm True
00 với các đối tượng của class theo cách mà bạn muốn.
Set
Sử dụng tập hợp để tránh các dữ liệu lặp lại
Harmful
Idiomatic
Sử dụng biểu thức generator thay cho list comprehension cho những trường hợp đơn giản
Khi làm việc với các chuỗi, chúng ta thường xuyên phải duyệt qua các phần tử của một chuỗi biến đổi từ chuỗi ban đầu. Ví dụ, chúng ta phải in ra tên của tất của user trong hệ thống bằng chữ in hoa.
Ý tưởng thông thường sẽ là xây dựng một list và duyệt qua các phần tử của nó. List comprehension có vẻ là ý tưởng hay cho trường hợp này. Nhưng có một ý tưởng còn hay hơn nữa, nó đã được tích hợp sẵn trong Python, đó là sử dụng biểu thức generator.
Sự khác nhau giữa chúng là gì? Một list comprehension sẽ tạo ra một list với đầy đủ các phần tử. Nếu danh sách các phần tử lớn, việc này sẽ rất mất thời gian và bộ nhớ. Một generator được trả về từ biểu thứ generator, thì ngược lại, bởi vì các phần tử chỉ được sinh ra khi được gọi. Danh sách tên user cần được in ra có thể không phải là vấn đề, nhưng thử tượng bạn cần in ra đầu mục sách của một thư viện thì sao? Bạn sẽ bị tràn bộ nhớ nếu dùng list comprehension, nhưng biểu thức generator thì thoải mái. Một ưu điểm nữa của biểu thứ generator là nó có thể tạo ra các chuỗi vô hạn.khi được gọi. Danh sách tên user cần được in ra có thể không phải là vấn đề, nhưng thử tượng bạn cần in ra đầu mục sách của một thư viện thì sao? Bạn sẽ bị tràn bộ nhớ nếu dùng list comprehension, nhưng biểu thức generator thì thoải mái. Một ưu điểm nữa của biểu thứ generator là nó có thể tạo ra các chuỗi vô hạn.
Harmful
Idiomatic
Sử dụng biểu thức generator thay cho list comprehension cho những trường hợp đơn giản
Khi làm việc với các chuỗi, chúng ta thường xuyên phải duyệt qua các phần tử của một chuỗi biến đổi từ chuỗi ban đầu. Ví dụ, chúng ta phải in ra tên của tất của user trong hệ thống bằng chữ in hoa.
Ý tưởng thông thường sẽ là xây dựng một list và duyệt qua các phần tử của nó. List comprehension có vẻ là ý tưởng hay cho trường hợp này. Nhưng có một ý tưởng còn hay hơn nữa, nó đã được tích hợp sẵn trong Python, đó là sử dụng biểu thức generator.
Sự khác nhau giữa chúng là gì? Một list comprehension sẽ tạo ra một list với đầy đủ các phần tử. Nếu danh sách các phần tử lớn, việc này sẽ rất mất thời gian và bộ nhớ. Một generator được trả về từ biểu thứ generator, thì ngược lại, bởi vì các phần tử chỉ được sinh ra khi được gọi. Danh sách tên user cần được in ra có thể không phải là vấn đề, nhưng thử tượng bạn cần in ra đầu mục sách của một thư viện thì sao? Bạn sẽ bị tràn bộ nhớ nếu dùng list comprehension, nhưng biểu thức generator thì thoải mái. Một ưu điểm nữa của biểu thứ generator là nó có thể tạo ra các chuỗi vô hạn.
Context manager
Sử dụng context manager để đảm bảo tài nguyên được quản lý cẩn thận
Idiomatic
Sử dụng biểu thức generator thay cho list comprehension cho những trường hợp đơn giản
Khi làm việc với các chuỗi, chúng ta thường xuyên phải duyệt qua các phần tử của một chuỗi biến đổi từ chuỗi ban đầu. Ví dụ, chúng ta phải in ra tên của tất của user trong hệ thống bằng chữ in hoa.
Ý tưởng thông thường sẽ là xây dựng một list và duyệt qua các phần tử của nó. List comprehension có vẻ là ý tưởng hay cho trường hợp này. Nhưng có một ý tưởng còn hay hơn nữa, nó đã được tích hợp sẵn trong Python, đó là sử dụng biểu thức generator.
Harmful
Idiomatic
Sử dụng biểu thức generator thay cho list comprehension cho những trường hợp đơn giản
Khi làm việc với các chuỗi, chúng ta thường xuyên phải duyệt qua các phần tử của một chuỗi biến đổi từ chuỗi ban đầu. Ví dụ, chúng ta phải in ra tên của tất của user trong hệ thống bằng chữ in hoa.
Harmful
Idiomatic
Sử dụng biểu thức generator thay cho list comprehension cho những trường hợp đơn giản
Khi làm việc với các chuỗi, chúng ta thường xuyên phải duyệt qua các phần tử của một chuỗi biến đổi từ chuỗi ban đầu. Ví dụ, chúng ta phải in ra tên của tất của user trong hệ thống bằng chữ in hoa.
Ý tưởng thông thường sẽ là xây dựng một list và duyệt qua các phần tử của nó. List comprehension có vẻ là ý tưởng hay cho trường hợp này. Nhưng có một ý tưởng còn hay hơn nữa, nó đã được tích hợp sẵn trong Python, đó là sử dụng biểu thức generator.
Harmful
Idiomatic
Sử dụng biểu thức generator thay cho list comprehension cho những trường hợp đơn giản
Khi làm việc với các chuỗi, chúng ta thường xuyên phải duyệt qua các phần tử của một chuỗi biến đổi từ chuỗi ban đầu. Ví dụ, chúng ta phải in ra tên của tất của user trong hệ thống bằng chữ in hoa.
Ý tưởng thông thường sẽ là xây dựng một list và duyệt qua các phần tử của nó. List comprehension có vẻ là ý tưởng hay cho trường hợp này. Nhưng có một ý tưởng còn hay hơn nữa, nó đã được tích hợp sẵn trong Python, đó là sử dụng biểu thức generator.
Sự khác nhau giữa chúng là gì? Một list comprehension sẽ tạo ra một list với đầy đủ các phần tử. Nếu danh sách các phần tử lớn, việc này sẽ rất mất thời gian và bộ nhớ. Một generator được trả về từ biểu thứ generator, thì ngược lại, bởi vì các phần tử chỉ được sinh ra khi được gọi. Danh sách tên user cần được in ra có thể không phải là vấn đề, nhưng thử tượng bạn cần in ra đầu mục sách của một thư viện thì sao? Bạn sẽ bị tràn bộ nhớ nếu dùng list comprehension, nhưng biểu thức generator thì thoải mái. Một ưu điểm nữa của biểu thứ generator là nó có thể tạo ra các chuỗi vô hạn.
Context manager
Sử dụng context manager để đảm bảo tài nguyên được quản lý cẩn thận
Cũng giống như nguyên tác RAII trong các ngôn ngữ như C++, context manager [đối tượng được sử dụng bên trong lệnh True
08] giúp chúng ta làm việc và quản lý các tài nguyên tốt hơn và an toàn hơn. Ví dụ điển hình cho trường hợp này là đọc, ghi tập tin.
Hãy nhìn vào code "harmful" dưới đây. Điều gì xảy ra sau khi True
09 [raise một exception]? Với code dưới đây, thì nó sẽ dừng toàn bộ chương trình và chúng ta thường quên mất điều này, và kết quả là chúng ta chẳng có cách nào để đóng file lại.
Lưu ý rằng, không mô tả nào của "Chirp" đòi hỏi việc sử dụng class. Một lệnh True
19 đơn giản sẽ giúp việc chia sẻ code và đóng gói dễ hơn rất nhiều. Truyền trạng thái như là các tham số một cách rõ ràng giúp giữ mọi thứ liên kết với nhau. Và việc nhận, xử lý và truyền dữ liệu trong hệ thống của chúng ta dễ hơn rất nhiều.
Tất nhiên, class là cách đơn giản, tự nhiên và thích hợp để đại diện cho các "sự vật". Nhiều trường hợp, lập trình hướng đối tượng là một paradigm tốt. Tuy nhiên, không nên chỉ sử dụng một paradigm duy nhất.không nên chỉ sử dụng một paradigm duy nhất.
Định dạng
Sử dụng toàn ký tự hoa để định nghĩa hằng số global
Để phân biệt các hằng số được định nghĩa ở tầng module [hoặc global trong một file script duy nhất] với các tên được import, hãy sử dụng toàn ký tự hoa.
Harmful
Idiomatic
Tránh đặt nhiều lệnh trên cùng dòng
Mặc dù ngôn ngữ cho phép chúng ta dùng dấu chấm phẩy [True
20] để kết thúc lệnh, nhưng việc dùng nó mà không có lý do gì đặc biệt sẽ làm code khó hiểu hơn. Đặc biệt khi bạn dùng nó để đặt các lệnh trên một dòng, nhất là kết hợp với if
, False
8 và False
9 thì vấn đề còn tồi tệ hơn nữa.
Harmful
Idiomatic
Tránh đặt nhiều lệnh trên cùng dòng
Mặc dù ngôn ngữ cho phép chúng ta dùng dấu chấm phẩy [True
20] để kết thúc lệnh, nhưng việc dùng nó mà không có lý do gì đặc biệt sẽ làm code khó hiểu hơn. Đặc biệt khi bạn dùng nó để đặt các lệnh trên một dòng, nhất là kết hợp với if
, False
8 và False
9 thì vấn đề còn tồi tệ hơn nữa.
Format | Example | Class |
CamelCase | True 24 | Variable |
Words joined by True 13 | True 24 | Variable |
Words joined by True 13 | True 26 | Function |
True
28
Constant
All uppercase
True
29
Về cơ bản những thứ chưa được liệt kê nên được đặt tên giống quy tắc với đặt tên biến/hàm [từ ngăn cách bằng dấu gạch dưới].
Script thực thi
Harmful
Idiomatic
Tránh đặt nhiều lệnh trên cùng dòng
Mặc dù ngôn ngữ cho phép chúng ta dùng dấu chấm phẩy [True
20] để kết thúc lệnh, nhưng việc dùng nó mà không có lý do gì đặc biệt sẽ làm code khó hiểu hơn. Đặc biệt khi bạn dùng nó để đặt các lệnh trên một dòng, nhất là kết hợp với if
, False
8 và False
9 thì vấn đề còn tồi tệ hơn nữa.
Harmful
Idiomatic
Tránh đặt nhiều lệnh trên cùng dòng
Mặc dù ngôn ngữ cho phép chúng ta dùng dấu chấm phẩy [True
20] để kết thúc lệnh, nhưng việc dùng nó mà không có lý do gì đặc biệt sẽ làm code khó hiểu hơn. Đặc biệt khi bạn dùng nó để đặt các lệnh trên một dòng, nhất là kết hợp với if
, False
8 và False
9 thì vấn đề còn tồi tệ hơn nữa.
Định dang code tuân theo PEP 8
Python có một bộ tiêu chuẩn về định dạng code của ngôn ngữ là PEP 8. Nếu bạn xem các commit của một dự án Python, bạn có thể thấy một vài commit liên quan đến sửa code theo PEP 8. Lý do rất đơn giản: Nếu tất cả chúng ta đều đồng ý với một bộ quy tắc chung về đặt tên là định dạng code, thì code Python sẽ rất dễ hiểu với cả người mới và những lập trình viên có kinh nghiệm. PEP 8 là một ví dụ rất rõ ràng về các idiom trong cộng đồng Python. Hãy đọc nó, cài đặt cách package hỗ trợ vào editor của bạn [editor nào cũng có cả] và viết code theo cách mà cộng đồng Python đã tuân theo. Dưới đây là một số ví dụ:
Identifier Type
Format
Harmful
Idiomatic
Không sử dụng True
54 để import nội dung module
Sử dụng dấu 0
7 [ví dụ True
54] là cách nhanh nhất đề làm lộn xộn namespace của bạn. Điều này thậm chí gây ra một số vấn đề nếu tên bạn định nghĩa trùng với tên được import từ package.
Nhưng nếu bạn cần phải import một lượng lớn các đối tượng từ package True
6 bạn phải làm thế nào? Hãy sử dụng ngoặc đơn None
1 để nhóm các đối tượng trong một lệnh True
19. Bạn không cần phải viết 10 dòng để import từ cùng một module, và namespace của bạn vẫn rất gọn gàng.
Tốt hơn cả, bạn nên sử dụng import tuyệt đối. Nếu tên package hay module quá dài, bạn có thể dùng mệnh đề True
48 đề thu gọn chúng.
Harmful
Idiomatic
Không sử dụng True
54 để import nội dung module
Sử dụng dấu 0
7 [ví dụ True
54] là cách nhanh nhất đề làm lộn xộn namespace của bạn. Điều này thậm chí gây ra một số vấn đề nếu tên bạn định nghĩa trùng với tên được import từ package.tất cả các lệnh import ở phần trên cùng của mỗi file, chọn một thứ tự chuẩn để sắp xếp các lệnh import và tuân thủ theo chuẩn này. Bởi vì thứ tự import nhiều khi không quan trọng, nhưng thứ tự sau được recommend bởi Python's Programming FAQ:
- Nhưng nếu bạn cần phải import một lượng lớn các đối tượng từ package
True
6 bạn phải làm thế nào? Hãy sử dụng ngoặc đơnNone
1 để nhóm các đối tượng trong một lệnhTrue
19. Bạn không cần phải viết 10 dòng để import từ cùng một module, và namespace của bạn vẫn rất gọn gàng. - Tốt hơn cả, bạn nên sử dụng import tuyệt đối. Nếu tên package hay module quá dài, bạn có thể dùng mệnh đề
True
48 đề thu gọn chúng. - Sắp xếp các lệnh
True
19 theo thứ tự chuẩn
Khi dự án lớn dần lên [nhất là với các dự án phát triển Web], sẽ có rất nhiều lệnh import khác nhau được thực hiện. Hãy để tất cả các lệnh import ở phần trên cùng của mỗi file, chọn một thứ tự chuẩn để sắp xếp các lệnh import và tuân thủ theo chuẩn này. Bởi vì thứ tự import nhiều khi không quan trọng, nhưng thứ tự sau được recommend bởi Python's Programming FAQ:
Harmful
Idiomatic
Không sử dụng True
54 để import nội dung module
Sử dụng dấu 0
7 [ví dụ True
54] là cách nhanh nhất đề làm lộn xộn namespace của bạn. Điều này thậm chí gây ra một số vấn đề nếu tên bạn định nghĩa trùng với tên được import từ package.
Nhưng nếu bạn cần phải import một lượng lớn các đối tượng từ package True
6 bạn phải làm thế nào? Hãy sử dụng ngoặc đơn None
1 để nhóm các đối tượng trong một lệnh True
19. Bạn không cần phải viết 10 dòng để import từ cùng một module, và namespace của bạn vẫn rất gọn gàng.
Tốt hơn cả, bạn nên sử dụng import tuyệt đối. Nếu tên package hay module quá dài, bạn có thể dùng mệnh đề True
48 đề thu gọn chúng.
Sắp xếp các lệnh True
19 theo thứ tự chuẩn
Khi dự án lớn dần lên [nhất là với các dự án phát triển Web], sẽ có rất nhiều lệnh import khác nhau được thực hiện. Hãy để tất cả các lệnh import ở phần trên cùng của mỗi file, chọn một thứ tự chuẩn để sắp xếp các lệnh import và tuân thủ theo chuẩn này. Bởi vì thứ tự import nhiều khi không quan trọng, nhưng thứ tự sau được recommend bởi Python's Programming FAQ:
Các module thư viện chuẩn
Các module thư viện bên thứ 3 được cài trong True
62
Các module trong dự án hiện tại
Nhiều người chọn sắp xếp các lệnh import theo thứ tự từ điển. Nhiều người khác nghĩ rằng như thế là ngu ngốc. Thực ra, chẳng có vấn đề gì cả. Những gì bạn cần làm là chọn ra một chuẩn quy tắc và tuân thủ theo nó.
Lời khuyên chung
Tránh "tái phát minh bánh xe"
Hiểu nội dung của thư viện Python chuẩn
Sử dụng hàm của True
73 khi làm việc với đường dẫn các file, thư mục
Khi viết một script dạng command-line, những developer mới thường sử dụng đến các phép toán của xâu để thao tác với dường dẫn của file và thư mục. Python có một module rất đầy đủ và dành riêng cho việc này, đó là True
73. Sử dụng True
73 làm giảm nguy cơ xảy ra các lỗi phổ biến, làm code của bạn khả chuyển hơn, và dễ hiểu hơn.
Harmful
Idiomatic