Một trong những khó khăn thường gặp trong Python là truyền đối số cho hàm một cách chính xác. Với “Keyword-Only Arguments”, bạn có thể kiểm soát và giảm thiểu tối đa những rủi ro này. Trong bài viết này mình sẽ trình bày chi tiết về cách thức hoạt động cũng như cách sử dụng tính năng này để viết code Python đáng tin cậy hơn.
Keyword-Only Arguments trong Python là gì?
Đối số chỉ định theo từ khóa (Keyword-Only Arguments) là một loại tham số đặc biệt trong Python, được thiết kế để bắt buộc người dùng khi gọi hàm phải chỉ định giá trị cho tham số đó thông qua tên của tham số, chứ không chỉ dựa vào vị trí. Nói cách khác, bạn không thể truyền giá trị cho đối số keyword-only bằng cách đặt nó ở một vị trí nhất định trong danh sách các tham số khi gọi hàm, mà buộc phải chỉ định tên của tham số đó một cách rõ ràng.
Trong Python, khi định nghĩa hàm, bạn có thể sử dụng tên của các tham số (parameters) để truyền giá trị vào, giống như sử dụng từ khóa. Việc truyền đối số qua từ khóa thường là tùy chọn, nhưng với đối số keyword-only, điều này là bắt buộc.
Ví dụ về Keyword-Only Arguments trong Python
Hàm print()
tích hợp sẵn trong Python là một ví dụ điển hình về việc sử dụng đối số chỉ định bằng tên. Bạn có thể truyền một danh sách các biểu thức để in ra trong cặp dấu ngoặc đơn. Theo mặc định, các giá trị in ra sẽ được phân tách nhau bởi một khoảng trắng. Bạn cũng có thể chỉ định một ký tự phân tách khác bằng cách sử dụng đối số “sep
“.
print("Xin", "chào", "mọi", "người", sep="-"
Đoạn code trên sẽ in ra kết quả:
Xin-chào-mọi-người
Giải thích và Diễn giải chi tiết:
- Đối Số Chỉ Định Bằng Tên (Keyword-Only Arguments): Thay vì chỉ sử dụng vị trí của tham số để truyền giá trị, ta có thể truyền giá trị vào bằng cách chỉ rõ tên của tham số đó. Với các đối số thông thường, Python xác định giá trị tương ứng của từng tham số dựa vào vị trí truyền vào. Ngược lại, “đối số chỉ định bằng tên” (hay keyword-only arguments) thì luôn cần được chỉ rõ tên tham số khi gọi hàm. Điều này giúp tăng tính rõ ràng của code, đặc biệt khi hàm có nhiều tham số.
- Dấu Hoa Thị
*
: Dấu hoa thị*
đóng vai trò quan trọng, nó đánh dấu điểm mà các đối số theo sau bắt buộc phải được truyền bằng cách sử dụng tên tham số (tức là các “đối số chỉ định bằng tên”). - Ví dụ
print()
: Hàmprint()
thường được sử dụng với đối sốsep
(separator) để thay đổi ký tự phân tách giữa các giá trị. Tham sốsep
là một ví dụ về đối số chỉ định bằng tên. Bạn buộc phải dùngsep=
để gán giá trị thay vì chỉ truyền một giá trị ở vị trí đó. Điều này rất hữu ích khi bạn muốn tùy chỉnh cách hiển thị dữ liệu.
Ví dụ: sử dụng sep với keyword-only arguments sai cách
Tham số sep
của hàm print()
là một ví dụ điển hình về tham số chỉ định theo từ khóa. Nếu bạn thử truyền giá trị cho sep
mà không dùng từ khóa sep=
, bạn sẽ không nhận được kết quả như mong đợi. Hãy xem qua ví dụ bên dưới:
print ("Chào", "Thế", "Giới", "-")
Kết quả khi chạy là:
Chào Thế Giới –
Giải thích:
- Trong ví dụ trên, dấu gạch ngang (-) được in ra như một phần của chuỗi, chứ không phải được sử dụng làm dấu phân cách giữa các chuỗi. Lí do là vì
sep
là một tham số chỉ định theo từ khóa và không được sử dụng đúng cách ở đây.
Sử dụng Keyword-Only argument trong hàm tự định nghĩa
Trong Python, để tạo ra một tham số chỉ có thể được truyền bằng từ khóa (keyword-only argument), bạn đặt một dấu hoa thị *
trước tham số đó khi định nghĩa hàm.
Các hàm do người dùng tự định nghĩa (user-defined functions) là những hàm mà chúng ta tự viết trong một class hoặc module, để thực hiện các hành động cụ thể.
Ví dụ
Trong hàm tinh_lai()
tự định nghĩa dưới đây, tham số lai_suat
là một tham số keyword-only. Điều này có nghĩa là, khi gọi hàm tinh_lai()
, giá trị cho tham số lai_suat
phải được truyền bằng từ khóa (ví dụ lai_suat=...
).
def tinh_lai(so_tien, *, lai_suat):
tien_lai = so_tien * lai_suat / 100
return tien_lai
tien_thu_duoc = tinh_lai(1000000, lai_suat=7)
print(tien_thu_duoc)
Kết quả khi chạy đoạn code trên:
70000.0
Lưu ý: Nếu bạn cố gắng gọi hàm tinh_lai()
theo cách truyền tham số thông thường (theo vị trí), chương trình sẽ báo lỗi.
Giải thích code:
def tinh_lai(so_tien, *, lai_suat):
: Đây là định nghĩa của hàmtinh_lai
.so_tien
là tham số thông thường (positional argument).- Dấu hoa thị
*
chỉ ra rằng các tham số theo sau nó (lai_suat
) sẽ là các tham số keyword-only. lai_suat
là tham số keyword-only, bắt buộc phải truyền bằng từ khóa.tien_lai = so_tien * lai_suat / 100
: Câu lệnh này tính số tiền lãi.return tien_lai
: Hàm trả về số tiền lãi vừa tính.tien_thu_duoc = tinh_lai(1000000, lai_suat=7)
: Đây là cách gọi hàmtinh_lai
đúng, truyền giá trị cho tham số keyword-onlylai_suat
bằng cáchlai_suat=7
.print(tien_thu_duoc)
: Câu lệnh in kết quả.
Ví dụ: Lỗi khi gọi hàm với Keyword-Only argument không đúng cách
Đoạn code dưới đây minh họa rằng, không thể sử dụng tham số theo vị trí (positional arguments) khi hàm yêu cầu tham số keyword-only.
def tinh_lai(so_tien, *, lai_suat):
tien_lai = so_tien * lai_suat / 100
return tien_lai
tien_lai_sai = tinh_lai(1000000, 7)
print(tien_lai_sai)
Khi chạy đoạn code này, bạn sẽ thấy kết quả lỗi như sau:
tien_lai_sai = tinh_lai(1000000, 7)
^^^^^^^^^^^^^^^^^^^^^
TypeError: tinh_lai() takes 1 positional argument but 2 were given
Giải thích code và lỗi:
def tinh_lai(so_tien, *, lai_suat):
: Như đã giải thích ở trên, hàmtinh_lai
được định nghĩa vớiso_tien
là tham số thông thường vàlai_suat
là tham số keyword-only.tien_lai_sai = tinh_lai(1000000, 7)
: Dòng code này cố gắng gọi hàmtinh_lai
với1000000
choso_tien
và7
cholai_suat
, nhưng truyền7
theo vị trí (tức là truyền tham số thông thường).TypeError: tinh_lai() takes 1 positional argument but 2 were given
: Python báo lỗiTypeError
vì hàmtinh_lai
chỉ chấp nhận một tham số theo vị trí (so_tien
), nhưng chúng ta lại truyền tới 2 tham số theo vị trí (bao gồm1000000
và7
). Điều này là không hợp lệ vì tham sốlai_suat
đã được chỉ định là tham số keyword-only.
Lời kết
Như vậy, chúng ta đã khám phá xong về Keyword-Only Arguments, một yếu tố quan trọng giúp tăng tính chính xác và dễ đọc cho các hàm trong Python. Mong rằng những thông tin trên sẽ giúp bạn hiểu rõ hơn và sử dụng linh hoạt tính năng này trong quá trình viết code.