2011-06-25 49 views
13

Original title:Dấu ngoặc kép có nghĩa là gì trong một cuộc gọi hàm? ví dụ. func (stuff) (công cụ)?

"? giúp tôi hiểu Python thành ngữ lạ này sys.stdout = codecs.getwriter('utf-8')(sys.stdout)"

Tôi sử dụng thành ngữ này tất cả các thời gian để in một loạt các nội dung tiêu chuẩn trong utf-8 bằng Python 2. *:

sys.stdout = codecs.getwriter('utf-8')(sys.stdout) 

Nhưng thành thật mà nói, tôi không biết (sys.stdout) đang làm gì. Nó loại nhắc tôi về một đóng cửa Javascript hoặc một cái gì đó. Nhưng tôi không biết cách tìm kiếm thành ngữ này trong tài liệu Python.

Bạn có thể giải thích điều gì đang xảy ra ở đây không? Cảm ơn!

Trả lời

21

.getwriter trả về hàm đối tượng có thể gọi; bạn chỉ đơn thuần gọi nó trong cùng một dòng.

Ví dụ:

def returnFunction(): 
    def myFunction(): 
     print('hello!') 
    return myFunction 

Demo:

>>> returnFunction()() 
hello! 

Bạn có thể luân phiên thực hiện:

>>> result = returnFunction() 
>>> result() 
hello! 

Visualization:

012.
evaluation step 0: returnSomeFunction()() 
evaluation step 1: |<-somefunction>-->|() 
evaluation step 2: |<----result-------->| 
+0

Tuy nhiên, trong ví dụ này tập thứ hai của parantheses là một * Lớp điều hành instantiation *, không phải là một lời gọi hàm. (Xem http://docs.python.org/tutorial/classes.html#class-objects) Ngoài ra, vui lòng không chỉnh sửa câu hỏi để phù hợp với câu trả lời của bạn. –

+0

@junjanes: Cảm ơn bạn đã chỉ ra rằng chi tiết (mặc dù một "nhà điều hành instantiation lớp" là trong thực tế chỉ cần lớp (đối tượng gọi) hoặc chức năng nhà máy (đối tượng có thể gọi)). Bạn giải thích sai mặc dù lý do để chỉnh sửa: nó không phải là để làm cho câu trả lời của tôi "phù hợp tốt hơn", mà là để tóm tắt tốt hơn câu hỏi. (Ngẫu nhiên, nó không thực sự làm cho câu trả lời của tôi phù hợp hơn, hơn nữa nó làm cho * trả lời của bạn * phù hợp tốt hơn.) Trong ánh sáng của mối quan tâm của bạn mặc dù, tôi sẽ lại thêm tiêu đề ban đầu trong câu hỏi. – ninjagecko

4

codecs.getwriter('utf-8') trả về lớp học với hành vi StreamWriter và đối tượng của ai có thể được khởi tạo bằng luồng.

>>> codecs.getwriter('utf-8') 
<class encodings.utf_8.StreamWriter at 0x1004b28f0> 

Vì vậy, bạn đang làm một cái gì đó tương tự như:

sys.stdout = StreamWriter(sys.stdout) 
Các vấn đề liên quan