2012-07-03 33 views
25

thể trùng lặp:
Understanding kwargs in PythonĐiều gì làm * và ** trước tên biến có ý nghĩa trong chữ ký hàm?

Tôi đã đọc một đoạn mã python, và tôi không biết những gì hiện * và ** nghĩa trong mã này:

def functionA(self, *a, **kw): 
    // code here 

Tôi chỉ biết một lần sử dụng *: trích xuất tất cả thuộc tính mà nó có tham số của phương thức hoặc hàm tạo.

Nếu điều này đúng với chức năng trên, vì vậy phần còn lại: **?

+4

http: // docs.python.org/tutorial/controlflow.html#keyword-arguments –

+1

>. hqt

+2

Chúng tôi biết thật khó để google cho cú pháp. Câu hỏi của bạn không được đóng bởi vì mọi người nghĩ rằng nó là ngu ngốc - nó đã bị đóng vì chúng tôi không muốn có quá nhiều thông tin trùng lặp trên SO. –

Trả lời

78

Bên trong một hàm tiêu đề :

* thu thập tất cả các đối số vị trí trong một tuple

** thu thập tất cả các đối số từ khóa i Từ điển na

>>> def functionA(*a, **kw): 
     print(a) 
     print(kw) 


>>> functionA(1, 2, 3, 4, 5, 6, a=2, b=3, c=5) 
(1, 2, 3, 4, 5, 6) 
{'a': 2, 'c': 5, 'b': 3} 

Trong một cuộc gọi chức năng:

* giải nén một danh sách hoặc tuple vào đối số vị trí

** giải nén một cuốn từ điển vào đối số từ khóa

>>> lis=[1, 2, 3, 4] 
>>> dic={'a': 10, 'b':20} 
>>> functionA(*lis, **dic) #it is similar to functionA(1, 2, 3, 4, a=10, b=20) 
(1, 2, 3, 4) 
{'a': 10, 'b': 20} 
+0

Không cần "tự" - đây không phải là định nghĩa trong lớp ... –

+0

@AndrewJaffe cảm ơn! giải pháp được chỉnh sửa. –

+0

+1 giải thích tuyệt vời – Levon

5

** lấy tên đối số được chỉ định và đặt chúng vào từ điển. Vì vậy:

def func(**stuff): 
    print(stuff) 

func(one = 1, two = 2) 

Sẽ in:

{'one': 1, 'two': 2} 
1

** phương tiện tên đối số của các hàm.

$ cat 2.py 
def k(**argv): 
    print argv 

k(a=10, b = 20) 

$ python 2.py 
{'a': 10, 'b': 20} 

argv là từ điển chứa tất cả các đối số được đặt tên của hàm.

Và bạn cũng có thể đảo ngược. Bạn có thể sử dụng một từ điển như một bộ aruments cho một chức năng:

def k(a=10, b=20): 
    print a 
    print b 

d={'a':30,'b':40} 
k(**d) 

sẽ in

30 
40 
Các vấn đề liên quan