Các tiêu chuẩn thư viện open
chức năng vừa là một chức năng:Làm thế nào để sử dụng Python đóng quản lý bối cảnh
f = open('file.txt')
print(type(f))
<type 'file'>
hoặc như một người quản lý bối cảnh:
with open('file.txt') as f:
print(type(f))
<type 'file'>
Tôi cố gắng để bắt chước hành vi này bằng contextlib.closing
, trong đó File
là tệp tùy chỉnh I/O của tôi:
def myopen(filename):
f = File(filename)
f.open()
return closing(f)
này làm việc như mong đợi như một người quản lý bối cảnh:
with myopen('file.txt') as f:
print(type(f))
<class '__main__.File'>
nhưng tất nhiên nếu tôi gọi trực tiếp, tôi lấy lại đối tượng closing
thay vì đối tượng của tôi:
f = myopen(filename)
print(type(f))
<class 'contextlib.closing'>
Vì vậy, làm thế nào để thực hiện myopen
để cả hai hoạt động như một trình quản lý ngữ cảnh và trả về đối tượng Tệp của tôi khi được gọi trực tiếp?
dụ làm việc đầy đủ trên github: https://gist.github.com/1352573
Đó không phải là thứ 'đóng' cho. Bạn sử dụng 'đóng' khi bạn viết' with' để biến bất kỳ đối tượng nào bằng phương thức 'close' thành một trình quản lý ngữ cảnh. Bạn không sử dụng nó trước thời hạn. Ví dụ [trong tài liệu 'contextlib'] (http://docs.python.org/library/contextlib.html#contextlib.closing) có vẻ khá rõ ràng. Nếu bạn muốn có thể biến nó thành người quản lý ngữ cảnh bất cứ lúc nào, thì câu trả lời của Zach là chính xác. – agf