Nó không phải là một toán tử như vậy, vì vậy nó không thực sự có tên, nhưng nó được định nghĩa là "quy tắc cú pháp" . Vì vậy, nó nên được gọi là:
- "cú pháp giải nén từ khóa"
Nếu bạn có một danh sách các đối số, *args
thì nó được gọi là "giải nén đối số" , theo cách tương tự **kwargs
được gọi là "giải nén đối số từ khóa" .
Nếu bạn sử dụng nó ở phía bên trái của một =
, như trong a, *middle, end = my_tuple
, bạn sẽ nói "tuple unpacking" .
Tổng cộng, có ba loại đối số (tham số đơn):
def f(x) # x: positional argument
def f(x, y=0) # y: keyword argument
def f(x, *xs, y=0) # y: keyword-only argument
Đối *args
số được gọi là "tham số vị trí biến" và **kwargs
là "tham số từ khóa biến". Các đối số chỉ từ khóa không thể được đưa ra theo vị trí, bởi vì một tham số vị trí thay đổi sẽ lấy tất cả các đối số bạn vượt qua.
Hầu hết điều này có thể được tìm thấy trong PEP 0362 và 3102 , cũng như trong phần Dòng điều khiển của tài liệu. Cần lưu ý rằng mặc dù đối tượng chữ ký hàm PEP chỉ là một bản nháp và thuật ngữ có thể chỉ là ý tưởng của một người. Nhưng dù sao họ cũng là những điều khoản tốt. :)
Vì vậy, *
và các **
đối số chỉ giải nén cấu trúc dữ liệu tương ứng của chúng:
args = (1, 2, 3) # usually a tuple, always an iterable[1]
f(*args) → f(1, 2, 3)
# and
kwargs = {"a": 1, "b": 2, "c": 3} # usually a dict, always a mapping*
f(**kwargs) -> f(a=1, b=2, c=3)
[1]: Iterables là các đối tượng thực hiện __iter__()
phương thức và ánh xạ là các đối tượng thực hiện keys()
và __getitem__()
. Bất kỳ đối tượng nào hỗ trợ giao thức này sẽ được các nhà xây dựng hiểu tuple()
và dict()
vì vậy chúng có thể được sử dụng để giải nén các đối số.