Как использовать менеджер контекста закрытия Python

Стандартная библиотека 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

7
задан tshepang 8 March 2014 в 07:49
поделиться