2010-09-14 41 views
6

Tôi không phải là một anh chàng python và tôi đang cố gắng để hiểu một số mã python. Tôi tự hỏi dòng cuối cùng của mã dưới đây là gì? Đó là loại đối tượng được trả lại? hoặc danh sách 3 đối tượng được trả về?Cú pháp python này có nghĩa là gì?

req = SomeRequestBean() 
req.setXXX(xxx) 
req.YYY = int(yyy) 

device,resp,fault = yield req   #<----- What does this mean ? 

Trả lời

9

Có hai điều đang diễn ra trong dòng đó. Một trong những dễ dàng hơn để giải thích là báo cáo kết quả yield được trả lại một giá trị mà là một chuỗi, do đó dấu phẩy mất giá trị của dãy và đặt chúng trong các biến, nhiều như thế này:

>>> def func(): 
...  return (1,2,3) 
... 
>>> a,b,c = func() 
>>> a 
1 
>>> b 
2 
>>> c 
3 

Bây giờ, báo cáo kết quả yield được sử dụng để create a generator, có thể trả lại một số giá trị thay vì chỉ một giá trị, trả về một giá trị mỗi lần sử dụng yield. Ví dụ:

>>> def func(): 
...  for a in ['one','two','three']: 
...   yield a 
... 
>>> g = func() 
>>> g.next() 
'one' 
>>> g.next() 
'two' 
>>> g.next() 
'three' 

Có hiệu lực, chức năng dừng tại câu hỏi yield, đang chờ để được hỏi giá trị tiếp theo trước khi tiếp tục.

Trong ví dụ trên next() nhận giá trị tiếp theo từ trình tạo. Tuy nhiên, nếu chúng ta sử dụng send() thay vì chúng ta có thể gửi các giá trị trở lại các máy phát điện được trả về bởi các tuyên bố yield lại vào chức năng:

>>> def func(): 
...  total = 0 
...  while True: 
...  add = yield total 
...  total = total + add 
... 
>>> g = func() 
>>> g.next() 
0 
>>> g.send(10) 
10 
>>> g.send(15) 
25 

Đưa này tất cả cùng nhau chúng ta nhận được:

>>> def func(): 
...  total = 0 
...  while True: 
...   x,y = yield total 
...   total = total + (x * y) 
... 
>>> g = func() 
>>> g.next() 
0 
>>> g.send([6,7]) 
42 

Một máy phát điện được sử dụng theo cách này là called a coroutine.

4

dòng cuối cùng được giải nén một tuple từ phương pháp send của coroutine rằng mã hiển thị tọa lạc tại

mà là để nói rằng nó xảy ra trong một chức năng:.

def coroutine(*args): 
    yield None 
    req = SomeRequestBean() 
    req.setXXX(xxx) 
    req.YYY = int(yyy) 

    device,resp,fault = yield req 

sau đó có mã khách hàng ở đâu đó trông giống như thế này.

co = coroutine(*args) 
next(co) # consume the first value so we can start sending. 
co.send((device, resp, fault)) 

một ví dụ đơn giản này mà không liên quan đến coroutines là một cái gì đó dọc theo dòng của

a, b, c = (1, 2, 3) 

hoặc (hơi fancier)

for a, b in zip(['a', 'b'], [1, 2]): 
    print a, b 

đây nén nhuận tuples mà có được giải nén đến ab. do đó, một bộ sẽ trông giống như ('a', 1) và sau đó a == 'a'b == 1.

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