Hướng dẫn idiomatic python - con trăn thành ngữ

"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.

Show

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ặc None được trả về bởi các phương thức True0 hoặc True1

Đ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 True0 hoặc True1.

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, True6 có thể nhận giá trị True7 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 False0 và False1. Sử dụng phép so sánh False2 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 False3). Sử dụng False4 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, False4 hoạt động giống như là False2, 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ư False9, None0, None1. Nếu một biến None2 mà rỗng thì điều kiện None3 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 None8? 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 False1. Việc so sánh với None (singleton trong Python) luôn luôn phải sử dụng False4 hoặc False1 chứ không sử dụng False2 (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, False8 hay False9 nên ở riêng một dòng và không có lệnh nào ở sau None0.

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 False6. Đây cũng là ví dụ rất tốt để làm quen với False7.

Harmful

Idiomatic

Hàm

Tránh sử dụng False8, False9 và None0 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 01 thay vì 02 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 False8, False9 và None0 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 01 thay vì 02 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 False8, False9 và None0 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 01 thay vì 02 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 03 và 04 để 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 03 và 04 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 False8, False9 và None0 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 01 thay vì 02 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 03 và 04 để 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 03 và 04 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ử 07 đạ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ử 07 giúp chúng ta trong trường hợp như vậy.

Harmful

Idiomatic

Dictionary

Sử dụng tham số 09 của 00 để đặ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ố 09 của 00 thường xuyên bị bỏ quên. Nếu không sử dụng tham số này (hoặc class 03) 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" (None3). 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 None4 chúng ta định nghĩa None5 thì nó sẽ được "chia cắt" thành None6.

Harmful

Idiomatic

Định nghĩa phương thức None7 để 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 None8, 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 None7, bạn có thể thay đổi việc gọi hàm True00 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 None7 để 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 None8, 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 None7, bạn có thể thay đổi việc gọi hàm True00 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:

  1. Sử dụng tập hợp để tránh các dữ liệu lặp lại
  2. 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:
  3. 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 None7 để 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 None8, 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 None7, bạn có thể thay đổi việc gọi hàm True00 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 None7 để 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 None8, 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 None7, bạn có thể thay đổi việc gọi hàm True00 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 True01 để 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 True01 đượ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 None1, cú pháp comprehension, v.v...

Set

Idiomatic

Định nghĩa phương thức None7 để 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 None8, 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 None7, bạn có thể thay đổi việc gọi hàm True00 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 True08) 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 True09 (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 True19 đơ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 (True20) để 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, False8 và False9 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 (True20) để 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, False8 và False9 thì vấn đề còn tồi tệ hơn nữa.

Định dang code tuân theo PEP 8Python 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
FormatExampleClass
CamelCase True24 Variable
Words joined by True13 True24 Variable
Words joined by True13 True26 Function

True28

Constant

All uppercase

True29

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 (True20) để 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, False8 và False9 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 (True20) để 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, False8 và False9 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 True54 để import nội dung module

Sử dụng dấu 07 (ví dụ True54) 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 True6 bạn phải làm thế nào? Hãy sử dụng ngoặc đơn None1 để nhóm các đối tượng trong một lệnh True19. 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 đề True48 đề thu gọn chúng.

Harmful

Idiomatic

Không sử dụng True54 để import nội dung module

Sử dụng dấu 07 (ví dụ True54) 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:

  1. Nhưng nếu bạn cần phải import một lượng lớn các đối tượng từ package True6 bạn phải làm thế nào? Hãy sử dụng ngoặc đơn None1 để nhóm các đối tượng trong một lệnh True19. 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.
  2. 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 đề True48 đề thu gọn chúng.
  3. Sắp xếp các lệnh True19 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 True54 để import nội dung module

Sử dụng dấu 07 (ví dụ True54) 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 True6 bạn phải làm thế nào? Hãy sử dụng ngoặc đơn None1 để nhóm các đối tượng trong một lệnh True19. 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 đề True48 đề thu gọn chúng.

Sắp xếp các lệnh True19 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 True62

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 True73 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à True73. Sử dụng True73 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