và cho phép một hàm chấp nhận . gom các đối số dư thừa vào một tuple; gom các đối số dư thừa vào một dict. (Các tên này là quy ước — và mới là điều quan trọng.)
và cho phép một hàm chấp nhận . gom các đối số dư thừa vào một tuple; gom các đối số dư thừa vào một dict. (Các tên này là quy ước — và mới là điều quan trọng.)
*args**kwargs*args**kwargs***def total(*args): # gom tất cả đối số vị trí vào một tuple
print(args) # ví dụ (1, 2, 3)
return sum(args)
total(1, 2, 3) # 6
total(1, 2, 3, 4, 5) # 15 — bất kỳ số lượng đối số nào
def configure(**kwargs): # gom các đối số từ khóa vào một dict
print(kwargs) # ví dụ {"host": "localhost", "port": 8080}
for key, value in kwargs.items():
print(f"{key} = {value}")
configure(host="localhost", port=8080, debug=True)
def func(a, b, *args, **kwargs):
# a, b → vị trí bắt buộc
# args → vị trí dư thừa (tuple)
# kwargs → từ khóa dư thừa (dict)
...
func(1, 2, 3, 4, x=5, y=6)
# a=1, b=2, args=(3, 4), kwargs={"x": 5, "y": 6}
Thứ tự bắt buộc là: tham số thông thường, rồi *args, rồi **kwargs.
# `*` và `**` cũng UNPACK (giải nén) các collection VÀO các đối số tại điểm gọi
numbers = [1, 2, 3]
total(*numbers) # giống total(1, 2, 3)
settings = {"host": "x", "port": 80}
configure(**settings) # giống configure(host="x", port=80)
Cùng cú pháp đó giải nén một list/dict thành các đối số vị trí/từ khóa — tiện lợi cho việc chuyển tiếp đối số.
def wrapper(*args, **kwargs):
# chấp nhận BẤT KỲ đối số nào và chuyển chúng qua nguyên vẹn
return original_func(*args, **kwargs)
Mẫu chuyển-tiếp này là cách các decorator và hàm wrapper xử lý bất kỳ chữ ký hàm nào.
*args/**kwargs cho phép các chữ ký hàm linh hoạt chấp nhận bất kỳ số lượng đối số nào — thiết yếu để viết các tiện ích đa mục đích, wrapper, và đặc biệt là decorator (vốn phải bao bọc các hàm có chữ ký chưa biết thông qua *args, **kwargs).
Chiều unpacking (*list, **dict) cũng hữu ích không kém cho việc chuyển tiếp hoặc trải các đối số.
Hiểu cả gom lẫn giải nén là then chốt để viết code Python tái sử dụng được, tổng quát và để đọc nhiều API thư viện cùng các decorator dựa vào các tính năng này.