0
0
Lập trình
TT

Mẹo Python: Làm chủ *args và **kwargs (Giải thích Packing Tham số) 🎁

Đăng vào 2 tuần trước

• 4 phút đọc

Mẹo Python: Làm chủ *args và **kwargs (Giải thích Packing Tham số) 🎁

Khi bạn đã thành thạo việc unpacking, tức là phân tách một iterable thành các biến riêng lẻ, hãy cùng khám phá quá trình ngược lại: packing biến. Packing là việc thu thập nhiều giá trị độc lập thành một biến duy nhất, thường là một tuple hoặc một dictionary. Đây là một khái niệm rất quan trọng, đặc biệt khi xây dựng các hàm linh hoạt.

Packing Tham số Vị trí với *args

Khi được sử dụng trong định nghĩa hàm, dấu sao đơn (*) là một toán tử packing. Nó cho phép một hàm nhận một số lượng tham số vị trí thay đổi (các tham số được truyền mà không có từ khóa) và thu thập chúng vào một tuple duy nhất. Tên gọi thông thường cho tham số này là args, viết tắt của "arguments".

Ví Dụ Thực Tế

Giả sử bạn muốn một hàm có thể tính tổng bất kỳ số lượng giá trị nào mà không cần định nghĩa một tham số riêng cho mỗi giá trị. Đây là một công việc hoàn hảo cho *args.

python Copy
def my_sum(*args):
    """Tính tổng của bất kỳ số lượng giá trị."""
    return sum(args)

# Bạn có thể gọi hàm với bất kỳ số lượng tham số nào
print(my_sum(1, 2, 3))
print(my_sum(10, 20, 30, 40, 50))

Kết quả:

Copy
6
150

Để xem điều gì đang xảy ra bên trong, hãy kiểm tra biến args trong một ví dụ mới. Nó là một tuple chứa tất cả các tham số vị trí.

python Copy
def inspect_args(*args):
    print(f"Tuple đã được packing: {args}")
    print(f"Loại: {type(args)}")

inspect_args(1, "hello", True)

Kết quả:

Copy
Tuple đã được packing: (1, 'hello', True)
Loại: <class 'tuple'>

Packing Tham số Từ khóa với **kwargs

Dấu sao đôi (**) được sử dụng để packing một số lượng tham số từ khóa thay đổi (các tham số được truyền theo định dạng key=value) vào một dictionary duy nhất. Tên gọi thông thường là kwargs, viết tắt của "keyword arguments."

Điều này cực kỳ hữu ích cho các hàm nhận một tập hợp tùy ý các tùy chọn cấu hình hoặc thông tin người dùng. Dưới đây là một ví dụ lấy cảm hứng từ một hàm client API.

python Copy
def configure_api(**kwargs):
    """Cấu hình một client API với các thiết lập tùy chọn."""
    defaults = {'timeout': 5, 'retries': 3, 'api_key': 'default'}
    defaults.update(kwargs)

    print("--- Cấu hình API ---")
    for key, value in defaults.items():
        print(f"{key.replace('_', ' ').title()}: {value}")
    print("-------------------------")

configure_api(api_key='your_secret_key', retries=5)

Kết quả:

Copy
--- Cấu hình API ---
Timeout: 5
Retries: 5
Api Key: your_secret_key
-------------------------

Sử dụng cả *args**kwargs

Bạn có thể kết hợp cả *args**kwargs trong một định nghĩa hàm duy nhất. Khi làm như vậy, thứ tự rất quan trọng: tham số vị trí sẽ đến trước, tiếp theo là *args, và cuối cùng là **kwargs. Đây là một quy tắc nghiêm ngặt trong Python.

python Copy
def flexible_function(required_arg, *args, **kwargs):
    print(f"Tham số Bắt buộc: {required_arg}")
    print(f"Tham số Vị trí (*args): {args}")
    print(f"Tham số Từ khóa (**kwargs): {kwargs}")

flexible_function("hello", 1, 2, 3, a=10, b=20)

Kết quả:

Copy
Tham số Bắt buộc: hello
Tham số Vị trí (*args): (1, 2, 3)
Tham số Từ khóa (**kwargs): {'a': 10, 'b': 20}

Bởi vì args là một tuple và kwargs là một dictionary, bạn có thể sử dụng tất cả các phương thức thông thường như len(args) hoặc kwargs.get('key') để xử lý an toàn các giá trị bên trong.

Thực Hành Tốt Nhất

  • Chỉ sử dụng *args**kwargs khi cần thiết: Tránh lạm dụng để giữ cho mã nguồn rõ ràng.
  • Đặt tên cho các tham số rõ ràng: Điều này giúp tăng tính dễ đọc của mã.
  • Sử dụng chú thích: Giúp những người khác hiểu rõ hơn về mục đích của từng tham số.

Cạm Bẫy Thường Gặp

  • Quên thứ tự tham số: Như đã nói ở trên, thứ tự tham số là rất quan trọng. Đảm bảo bạn không đảo lộn chúng.
  • Không kiểm tra loại dữ liệu: Đảm bảo rằng bạn xử lý các loại dữ liệu phù hợp bên trong hàm.

Mẹo Hiệu Suất

  • Tránh sử dụng *args với các loại dữ liệu lớn: Nếu bạn biết trước số lượng tham số, hãy định nghĩa rõ ràng để tối ưu hiệu suất.
  • Kiểm tra và xử lý lỗi: Đảm bảo rằng hàm của bạn xử lý các trường hợp không mong muốn và không bị lỗi khi nhận tham số không hợp lệ.

FAQ

*args**kwargs có thể sử dụng trong lớp không?

Có, bạn có thể sử dụng chúng trong các phương thức của lớp như bình thường.

Có nên sử dụng *args**kwargs cho tất cả các hàm không?

Không, chỉ sử dụng khi cần thiết để giữ mã nguồn dễ hiểu và dễ bảo trì.

Kết luận: Tại sao điều này quan trọng

Packing biến là một kiểu mẫu cơ bản trong Python cho phép bạn viết các hàm linh hoạt, dẻo dai và mạnh mẽ hơn. Đây là chìa khóa để làm cho mã của bạn DRY (Don't Repeat Yourself) bằng cách cho phép một hàm xử lý một loạt các đầu vào mà không cần phải sử dụng vô số câu lệnh if/else hoặc mã lặp lại. Trong thực tế, *args**kwargs được sử dụng rộng rãi trong các framework như Django và FastAPI để tạo ra các hàm có thể cấu hình cao và các thành phần tái sử dụng. Làm chủ mẫu đơn giản này là một bước quan trọng để viết mã thực sự chuyên nghiệp và bền vững.


*Aaron Rose là một kỹ sư phần mềm và nhà văn công nghệ tại tech-reader.blog và là tác giả của cuốn sách "Think Like a Genius."

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào