Python Code Best Practice

Bài viết này là tập hợp các phương pháp hay nhất để biết thêm về các mã đặc biệt trong python, đặc biệt nếu bạn chưa quen với python.

Xử lý ngoại lệ

Đây là một cách xử lý nếu mã của bạn gặp lỗi

Python
# Cách chưa hay
try:
    do_something()
except:
    pass

# Một cách tốt hơn (them vào logging), nhưng vẫn chưa tốt:
try:
    do_something()
except Exception:
    logging.exception() 

# Một cách tốt hơn:
try:
    do_something()
except ValueError:
    logging.exception()
    # thêm vào đoạn code xử lý ngoại lệ

Ở đây ta đã sử dụng loại Exception cụ thể (ValueError)

Các toán tử so sánh liên tiếp

Có nhiều cách so sánh trong Python:

Python
# Đừng như thế:
if 0 < x and x < 10:
    print('x lớn hơn 0 nhưng nhỏ hơn 10')


# Hãy thực hiện:
if 0 < x < 10:
    print('x lớn hơn 0 nhưng nhỏ hơn 10')

Đối số mặc định có thể thay đổi

Python
# cách sai !
# cách này sẽ dẫn đến bug trong chương trình của bạn
def add_fruit(fruit, box=[]):
    box.append(fruit)
    return box


# cách đúng
def add_fruit(fruit, box=None):
    if box is None:
        box = []

    box.append(fruit)
    return box

Định dạng chuỗi

Python
# Tránh sử dụng
# %-formatting
name = "Trong Nghia”
profession = "Coach"
print("Hello, %s. You are a %s." % (name, profession))

# Tốt hơn chút
# str.format()
print("Hello, {}. You are a {}.".format(name, profession))

# Ngon lành !
# f-strings
print(f"Hello, {name}. You are a {profession}.")

Chữ f trong chuỗi f cũng là viết tắt của “nhanh (fast)”. f-string nhanh hơn cả % -formatting và str.format().

Biểu thức điều kiện

Python
if x < 10:
    return 1
else:
    return 2

Có thể được tinh gọn thành:

Python
return 1 if x < 10 else 2

Lặp lại trên một biến lặp

Bạn không nhất thiết phải lặp lại các chỉ số của các phần tử trong một biến lặp nếu bạn không cần chúng. Bạn có thể lặp lại trực tiếp qua các phần tử.

Điều này làm cho mã của bạn trở nên python hơn.

Python
list_of_fruits = ["apple", "pear", "orange"]

# cách tệ
for i in range(len(list_of_fruits)):
    fruit = list_of_fruits[i]
    process_fruit(fruit)

# cách tốt
for fruit in list_of_fruits:
    process_fruit(fruit)

Lập chỉ mục / Đếm trong quá trình lặp

Python
# Đừng:
index = 0
for value in collection:
    print(index, value)
    index += 1


# Hay giống vậy
for index in range(len(collection)):
    value = collection[index]
    print(index, value)

# Cũng đừng như vậy
index = 0
while index < len(collection):
    value = collection[index]
    print(index, value)
    index += 1

# Hãy sử dụng `enumerate()`
for index, value in enumerate(collection):
    print(index, value)

Sử dụng trình quản lý ngữ cảnh

Python cung cấp trình quản lý ngữ cảnh quản lý chi phí khởi tạo và giải phóng tài nguyên và cho phép bạn tập trung vào việc triển khai. Ví dụ trong trường hợp đọc một tập tin, bạn không cần quan tâm đến việc đóng tệp theo cách thủ công.

Python
d = {"foo": 1}

# cách tệ 
f = open("data.csv", "wb")
f.write("some data")

v = d["bar"] # KeyError
f.close()  # dòng này sẽ không bao giờ được thực thi nên dẫn đến ảnh hưởng bộ nhớ

f.close()

# cách hay
with open("data.csv", "wb") as f:
    f.write("some data")
    v = d["bar"]
# python vẫn thực hiện f.close() dù cho xảy ra lỗi KeyError

Leave a Reply