2011-10-12 35 views
17

Tôi thích sự tiện lợi của nhiều bối cảnh with tuyên bố trong Python 2.7:Nhiều bối cảnh 'with` tuyên bố trong Python 2.6

with open('a.txt') as a, open('b.txt') as b: 
    do_many_amazing_things(a, b) 

Tuy nhiên, tôi cần phải duy trì khả năng tương thích với 2.6.

with được chuyển đến 2.5 qua __future__, nhưng tôi không thể tìm thấy bất kỳ điều gì về phiên bản nhiều ngữ cảnh được chuyển ngược lại thành 2.6 trong tài liệu.

Có điều gì tôi đã bỏ lỡ không?

EDIT: Tôi biết rằng có thể lồng các câu lệnh with. Tôi hỏi nếu nó có thể sử dụng nhiều với các câu lệnh.

+0

Tôi thực sự ngạc nhiên khi tính năng này được thêm vào với Python - nguyên tắc hướng dẫn luôn làm cho mọi thứ trở nên đơn giản và rõ ràng, nhưng vì việc lồng ghép các câu lệnh 'with' rất tự nhiên ... –

+2

Sẽ xấu nếu bạn làm nhiều hơn 2. –

Trả lời

20

Nếu không có tương đương tương thích ngược với điều này là có thể, tôi sẽ xử lý nó bằng cách tạo câu lệnh nhiều ngữ cảnh with một tập hợp các câu lệnh with lồng nhau.

with open('a.txt') as a: 
    with open('b.txt') as b: 
     do_many_amazing_things(a, b) 

EDIT để giải quyết sửa đổi của bạn:

Nếu bạn khăng khăng không làm tổ phụ with báo cáo, bạn luôn có thể sử dụng contextlib

import contextlib 
with contextlib.nested(open("a.txt"), open("b.txt")) as (a, b): 
    do_many_amazing_things(a,b) 

Đối với sử dụng nhiều with báo cáo từ tương lai nhập khẩu with, điều này là không thể theo như tôi biết

+0

Sẽ không giải pháp contextlib thất bại nếu tệp đầu tiên mở ra nhưng không phải tệp thứ hai - tệp đầu tiên sẽ không bị đóng? –

+0

@ Random Random Tôi tin như vậy, tôi nên đã đề cập rằng, nhưng đó là điều gần nhất tôi có thể tìm thấy ý định của Austin – jsvk

+0

Tôi không thấy lý do tại sao bạn nói rằng tập tin đầu tiên sẽ không được đóng lại. Nếu viết nó theo một cách giống với cách khác, thì tệp đầu tiên sẽ đóng lại bất kể luồng thực thi đã thoát ra khỏi ngữ cảnh đầu tiên như thế nào. – Gabriel

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