2013-08-27 47 views
9

Dla mnie najbardziej idiomatyczne sposób wywołania tempfile.mkstemp() będzie tak: (?)Jak wywołać funkcję tempfile.mkstemp() z "z"? - lub dlaczego nie zwraca fd z __exit __()?

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

jednak, to oczywiście podnosi AttributeError: __exit__

Wywołanie os.close(fd) jawnie przy użyciu try-w końcu to łatwy sposób, aby rozwiązać ten problem, ale czuje się jak pogwałcenie Powinien istnieć jeden - a najlepiej tylko jeden - czysty sposób na zrobienie tego.

Czy istnieje sposób, aby "naprawić" to w tempfile lub czy istnieje uzasadnienie, dlaczego zostało to zaimplementowane w ten sposób?

+4

Dzięki za zgłoszenie, prosimy o komentarz, jak poprawić pytanie. – Kimvais

Odpowiedz

5

W module istnieją inne, lepiej dopasowane sposoby tworzenia plików tymczasowych, takich jak TemporaryFile() i inne.

Zwłaszcza, jeśli nie chcesz, aby plik ma zostać usunięty, należy NamedTemporaryFile(), nadając mu delete=False argument.

7

Funkcjonowanie rachunku with jest zdefiniowana w PEP 343, w tym jego protokołem zarządzania tzw kontekstowego:

Ten PEP proponuje, że protokół składający się z wchodzi() i wyjścia Metody() są znane jako "protokół zarządzania kontekstem", , a obiekty, które implementują ten protokół, znane są jako "menedżerowie kontekstu ".

mkstemp nie zwraca menedżera kontekście, że jest to obiekt, który implementuje metody __enter__ i __exit__, a zatem nie jest kompatybilny.

Oczywistym rozwiązaniem jest utworzenie klasy opakowania, która implementuje protokół menedżera kontekstów.