Cách đặt tên biến nào sau đây là đúng trong Python

Ở bài viết trước, PEP8 - Chuẩn Kết Nối Toàn Cầu Của Python Dev [Phần 1] chúng ta đã cùng nhau tìm hiểu về tầm quan trọng của chuẩn PEP-8 và  một số chỉ dẫn liên quan đến "Trình bày các đoạn mã nguồn" [có cả lý thuyết và thực hành]. Bài viết tiếp theo này, chúng ta sẽ cùng nhau tìm hiểu về các chỉ dẫn liên quan đến đặt tên [naming] được nêu trong PEP-8.

Bài viết này sẽ nhấn mạnh vào hai vấn đến: - Quy tắc đặt tên theo chuẩn PEP8 của Python

- Khi nào dùng _, __ [underscore & double underscore]

Nói về đặt tên trong các chương trình phần mềm, điều đầu tiên cần phải nhấn mạnh [với tất cả các ngôn ngữ lập trình, không riêng gì python] đó là đặt tên có ý nghĩa, liên quan đến mục đích xuất hiện của biến dữ liệu, function, class,... Tránh việc đặt tên vô nghĩa để người khác đọc code và lại phải mất thời gian tìm hiểu mục đích sử dụng trong ngữ cảnh hiện tại [trừ trường hợp cố tình thực hiện làm "rối" code]. Các bạn có thể tìm đọc "Chapter 2 - Meaningful Names - cuốn sách Clean Code của Uncle Bod".

Naming - Các quy ước chung cho việc đặt tên trong Python.

PEP-8 gợi ý các kiểu đặt tên các biến [python được gọi là name], function, class, ... khá là độc đáo và khác với các ngôn ngữ khác. Các quy ước [conventions] này giúp dễ dàng phân biệt từng loại tương ứng khi đọc code. Quy ước chung của cách đặt tên gồm có:

  • Viết thường tất cả các ký tự [lower case]
  • Viết hoa tất cả các ký tự [upper case]
  • Nếu một tên có nhiều từ:
    • Nối giữa các từ bằng ký tự underscore _: lower_case_with_underscores, UPPER_CASE_WITH_UNDERSCORES
    • Viết hoa các chữ cái đầu tiên của một từ: CapWords, CamelCase...
    • Nếu các từ có ký tự viết tắt, lưu ý viết hoa toàn bộ ký tự viết tắt. Ví dụ: HTTPServerError

Ngoài các cách trên, còn một số cách đặt tên khác nhưng ít được dùng [không được khuyên dùng]:

  • Viết thường từ đầu tiên và viết hoa các chữ cái đầu của các từ tiếp theo: mixedCase, theUglyName,...
  • Viết hoa các chữ cái đầu tiên và dùng ký tự underscore để nối các từ: Capitalized_Words_With_Underscores, No_Name,...

Trong quá trình làm việc, để gom nhóm theo mục đích sử dụng, các lập trình có thể tiền tố và phía trước biến, function, ... nhưng vẫn theo quy tắc đặt tên chung trên.

Ví dụ: gom các attributes thuộc dữ liệu trả về trong os.start[]: st_mode, st_ino, st_dev, ... [tham khảo: //docs.python.org/2/library/os.html#os.stat]

Có một số lưu ý cần nhớ trong quy tắc đặt tên, tôi đã nêu trong bài viết gần đây: 3 Lỗi Thường Gặp Khi Mới Làm Quen Với Python. Các bạn có thể tham khảo tại mục "1. Đặt trùng tên biến và function với keyword"

Ngoài ra ra còn có một số lưu ý nhỏ khác như: - Không nên đặt tên bằng 01 ký tự đơn như: i, j, k, l, m, n....

- Trong trường hợp lowser case, nên để ý việc dùng l [letter l-L] và số 1, cũng như ký tự o [letter o-O] và số 0. Việc này sẽ hạn chế được việc hiển thị không rõ ràng các ký tự [do font chữ].

Từ các quy ước chung trên, PEP-8 đưa ra các đề xuất liên quan đến đặt tên cụ thể cho các trường hợp.

1. Đặt tên cho các module/package

Trong python, mỗi file được coi là một module, mỗi folder là một package. Quy tắc đặt tên của module và package là viết thường tất cả các ký tự, nếu có nhiều từ trong tên, dùng ký tự _ để nối giữa các từ.


Ví dụ:

├── random_package ├── __init__.py ├── random_number.py ├── random_string.py

Một số module được kế thừa từ C/C++, có thể đặt tên với ký tự _ ở phía trước.
Ví dụ: _socket

Lưu ý: Khi đặt tên module, package hãy cố gắng đừng đặt trùng tên với các module/package đã có sẵn của hệ thống. Như ở ví dụ trên, tôi đã đặt package là random_package để phân biệt được với module random đã có sẵn.

Nếu dev đặt tên module/package là random, khi thực hiện import random trình thông dịch của Python sẽ khó phân biệt cần import module random có của python hay import module random do dev viết ra [thường thì sẽ import được theo  ngữ cảnh/vị trí sắp xếp structure] và đôi khi kết quả của phần mềm không được như ý muốn.

2. Đặt tên cho các biến dữ liệu [variable/name], function:

Tên của các functions, variables được đặt tên ở định dạng chữ viết thường, nếu có nhiều từ, sẽ nối với nhau bởi ký tự underscore:

Ví dụ:

number = 10
lower_case_with_underscore = "this is a long name sample"

Biến dữ liệu được đặt là constants value [các dữ liệu không thay đổi], thường được viết hoa toàn bộ các ký tự và có dấu _ nối giữa các từ

ví dụ:
SECONDS_IN_HOUR = 3600
SECONDS_IN_DAY = 86400

Đôi lúc trong quá trình khai báo và sử dụng biến, có những biến dữ liệu không dùng để làm gì sẽ được khai báo là dấu _ [ý nghĩa là "don’t care"]

ví dụ:

members = ['Trang', 'An', 'Mai']
frist_member, _, last_member = members
print[first_member, last_member]

3. Đặt tên cho class và attribute/function trong class:

Các class trong Python được đặt tên theo định dạng CapitalizedWord [hoặc CamelCase].

Ví dụ: 

class RandomNumber: def __init__[self]: pass

Một số class đặc biệt trong Python được kết thúc bằng một từ khóa đặc biệt, ví dụ: Error cho các class thuộc phân lớp Exception: ValueError, NameError,...


Quy ước đặt tên với attribute/function trong class:

  • Mặc định, các attribute/function của một lớp được khai báo là public, quy tắc đặt tên như đặt tên biến [lower_case_with_underscore] 
  • Nếu khai báo protected , đặt 01 ký tự _ ở đầu tiên: _protected_attribute_name
  • Nếu khai báo private, đặt 02 ký tự _ ở đầu tiên: __private_attribute_name  [2 dấu underscore liên tiếp]

Quy ước khai báo tham số truyền vào function trong class:

  • Các function nằm trong một class, luôn phải có từ khóa self là tên của tham số đầu tiên [để tham chiếu về đối tượng]
  • Các function dạng "class method", luôn phải có từ khóa cls là tên của tham số đầu tiên [hiện tại, các dev thường sử dụng decorator hơn là dùng classmethod]

Ví dụ: 

class RandomNumber: def __init__[self]: self.seed_number = 0 self._step = 1 self.__version = "1.0" def export_random_numbers[self, max_number=100]: pass @classmethod def func[cls, export_random_numbers]: pass

Tổng kết

Ngoài việc mang ý nghĩa về "meaningful names", việc đặt tên trong Python còn mang ý nghĩa về "ngữ pháp" [syntax] của chương trình thông qua việc sử dụng các ký tự _ và __ trong lập trình hướng đối tượng [Object Oriented Programming - OOP]. 

Hy vọng, thông qua bài viết ngắn này, các bạn sẽ các có "từ khóa" để tiếp tục tìm hiểu về việc đặt tên sao cho hiệu quả [clean-code] và tự tin với việc sử dụng OOP trong Python [đón chờ bài viết tiếp theo của tôi về chủ đề OOP trong Python nhé].  Cảm ơn các bạn đã đọc bài viết. 

Cũng như các ngôn ngữ khác Python có một số các quy ước về đặt tên, chẳng hạn quy tắc đặt tên biến [variable], hàm [function], lớp [class], module, ...

Một tên được bắt đầu bằng các chữ cái viết hoa [A-Z], hoặc viết thường [a-z], hoặc kí tự gạch dưới [ _ ], theo sau đó có thể là các kí tự khác hoặc không có gì.
Python không chấp nhận các kí tự: @, $ và % xuất hiện ở trong tên.
Python là một ngôn ngữ lập trình có phân biệt chữ viết hoa và chữ viết thường, MyObject myobject là hai tên khác nhau.

Một số quy tắc đặt tên trong Python:

  1. Tên lớp [class] nên bắt đầu bằng một kí tự viết hoa, tất cả các tên khác đều bắt đầu bằng kí tự biết thường.
  2. Một tên được bắt đầu bằng dấu gạch dưới cho bạn biết rằng tên đó là riêng tư [private].
  3. Một tên được bắt đầu bằng hai dấu gạch dưới tức là tên đó rất riêng tư.
  4. Nếu một tên được bắt đầu bằng hai dấu gạch dưới và kết thúc cũng bằng hai dấu gạch dưới thì tên đó là một tên đặc biệt được Python định nghĩa sẵn.

Các từ khóa trong Python không nhiều, chúng không thể được dùng để đặt tên và không có ký tự viết hoa. Dưới đây là danh sách tất cả các từ khóa trong Python:

and assert break class continue def del elif else except exec finally for from global if import in is lambda not or pass raise return try yield while

Danh mục các từ đặc biệt:

None True False self cls class_

__import__ abs all any apply basestring bin bool buffer callable chr classmethod cmp coerce compile complex delattr dict dir divmod enumerate eval execfile file filter float format frozenset getattr globals hasattr hash help hex id input int intern isinstance issubclass iter len list locals long map max min next object oct open ord pow print property range raw_input reduce reload repr reversed round set setattr slice sorted staticmethod str sum super tuple type type unichr unicode vars xrange zip

Khác với các ngôn ngữ lập trình khác, Python không sử dụng các cặp từ khoá như: “begin” và “end” hay “{” và “}” để mở , đóng một khối lệnh. Thay vào đó Python quy ước các lệnh liên tiếp có cùng khoảng cách thụt đầu dòng [Line Indentation] là thuộc cùng một khối lệnh.

if True: print ["Hello"] print ["True"] else: print ["False"]

Nếu bạn viết như sau sẽ bị thông báo lỗi:

Quy tắc viết một lệnh [Statement] trên nhiều dòng:

Thông thường một lệnh [statement] của Python được viết trên 1 dòng, và ký tự xuống dòng nghĩa là kết thúc lệnh đó. Tuy nhiên có những lệnh dài, và bạn muốn viết trên nhiều dòng, bạn cần thông báo với Python ý định của bạn. Sử dụng dấu \ để nói với Python rằng lệnh bao gồm cả dòng tiếp theo. Ví dụ:

Quy tắc viết nhiều lệnh trên một dòng

Bạn có thể viết nhiều câu lệnh trên một dòng, bạn cần phải sử dụng dấu chấm phẩy [ ; ] để ngăn cách giữa các câu lệnh. Ví dụ:

a = 'One'; b = "Two"; c ="Three"

Python cho phép bạn sử dụng cặp dấu nháy đơn [  '  ], hoặc cặp dấu nháy kép [ " ] để biểu thị một chuỗi [String] trên một dòng:

str1 = 'Hello every body' str2 = "Hello Python"

Nếu một chuỗi viết trên nhiều dòng bạn cần sử dụng một cặp 3 dấu nháy kép [Và không cần sử dụng dấu \ ]:

multiLineStr = """This is a paragraph. It is made up of multiple lines and sentences."""

Kí tự thăng [#] không nằm trong chuỗi sẽ bắt đầu một dòng chú thích [Comment]. Tất cả các kí tự phía sau nó cho đến khi hết dòng được xem là một phần của câu chú thích và bộ thông dịch [interpreter] của Python sẽ bỏ qua chúng khi chạy chương trình.

# First comment print ["Hello, Python!"] # second comment # This is a comment. # This is a comment, too. # This is a comment, too. print ["Finish"]

Hiện nay phiên bản mới nhất của Python là 3.x, Python 3.x có các quy định về ngữ pháp chặt chẽ hơn so với Python 2.x, Các tài liệu hướng dẫn Python trên Internet hiện nay phần lớn đang sử dụng ngữ pháp 2.x và có thể nó làm bạn bối rối vì bạn đã học theo hướng dẫn mà vẫn bị thông báo lỗi.
 

Để in ra màn hình dòng chữ "Hello World", trong phiên bản 2.x bạn sử dụng dòng lệnh "print" mà không cần cặp dấu ngặc [ ]:

# Ngữ pháp Python 2.x print "Hello World"

Với Ngữ pháp Python 3.x để in ra dòng chữ "Hello World" bắt buộc bạn phải để nó trong dấu ngặc [ ], nếu không sẽ bị thông báo lỗi.

# Ngữ pháp Python 3.x print ["Hello World"]

Như vậy khi tạo một project bạn cần phải chỉ rõ bạn sẽ sử dụng ngữ pháp phiên bản nào. Dưới đây là minh họa "Tạo một project" trên Eclipse, và chỉ định "Ngữ pháp Python" phiên bản 3.6.

Video liên quan

Chủ Đề