2013-08-27 13 views
9

Đối với tôi cách thành ngữ hầu hết gọi tempfile.mkstemp() sẽ là như sau: (?)Làm thế nào để gọi tempfile.mkstemp() với "with"? - hoặc tại sao nó không trả về một fd với __exit __()?

with tempfile.mkstemp() as fd, filename: 
    pass 

tuy nhiên, điều này rõ ràng làm tăng AttributeError: __exit__

Calling os.close(fd) rõ ràng sử dụng thử-cuối cùng là một cách dễ dàng để giải quyết việc này, nhưng cảm thấy như vi phạm của Nên có một-- và tốt nhất là chỉ có một - cách rõ ràng để làm điều đó.

Có cách nào để "khắc phục" điều này trong tempfile hoặc có lý do chính đáng tại sao điều này đã được triển khai theo cách này không?

+4

Cảm ơn bạn đã viết xuống, vui lòng nhận xét cách cải thiện câu hỏi. – Kimvais

Trả lời

5

Trong mô-đun tempfile có các cách khác phù hợp hơn để tạo tệp tạm thời, chẳng hạn như TemporaryFile() và các tệp khác.

Đặc biệt, nếu bạn không muốn tệp bị xóa, hãy sử dụng NamedTemporaryFile(), trao cho đối số delete=False.

7

Các hoạt động của tuyên bố with được định nghĩa trong PEP 343, kể cả của nó giao thức quản lý cái gọi là bối cảnh:

PEP này đề xuất rằng các giao thức bao gồm các nhập() và thoát() phương thức được gọi là "giao thức quản lý ngữ cảnh", và các đối tượng triển khai giao thức đó được gọi là "bối cảnh người quản lý".

mkstemp không trả lại một người quản lý bối cảnh, đó là một đối tượng mà thực hiện các phương pháp __enter____exit__, và do đó không tương thích.

Cách giải quyết rõ ràng là tạo lớp bao bọc thực hiện giao thức quản lý ngữ cảnh.

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