Стандартная библиотека open
работает как функция:
f = open('file.txt')
print(type(f))
или как менеджер контекста:
with open('file.txt') as f:
print(type(f))
Я пытаюсь имитировать это поведение, используя contextlib.closing
, где File
это мой собственный класс файлового ввода-вывода:
def myopen(filename):
f = File(filename)
f.open()
return closing(f)
это работает, как ожидалось, как диспетчер контекста:
with myopen('file.txt') as f:
print(type(f))
но, конечно, если я вызываю напрямую, я возвращаю закрывающий объект
вместо моего объекта:
f = myopen(filename)
print(type(f))
Итак, как мне реализовать myopen
, чтобы он работал как диспетчер контекста и возвращал мой объект File при прямом вызове?
Полный рабочий пример на github: {{ 1}} https://gist.github.com/1352573