2009-02-22 24 views
14

Tôi đã luôn luôn giả định rằng một tập tin sẽ bị rò rỉ nếu nó được mở cửa mà không bị đóng cửa, nhưng tôi chỉ xác nhận rằng nếu tôi nhập dòng mã sau đây, các tập tin sẽ đóng cửa:Làm thế nào để python đóng các tập tin đã được gc'ed?

>>> f = open('somefile.txt') 
>>> del f 

Chỉ cần ra khỏi tò mò tuyệt , Cái này hoạt động ra sao? Tôi nhận thấy rằng tệp không bao gồm phương thức __ del __.

Trả lời

19

Trong CPython, ít nhất, tệp được đóng khi đối tượng tệp được deallocated. Xem hàm file_dealloc trong Objects/fileobject.c trong nguồn CPython. Phương thức Dealloc có kiểu như __del__ đối với các loại C, ngoại trừ không có một số vấn đề cố hữu với __del__.

+1

Để làm rõ, __del__ được gọi trong khi thu thập rác, và trong việc thực hiện C của Python cho các đối tượng tập tin xảy ra tại thời điểm khi không có thêm tham chiếu đến đối tượng tệp. –

4

Do đó, với tuyên bố.

Đối với Python 2.5, sử dụng

from __future__ import with_statement 

(Đối với Python 2.6 hoặc 3.x, không làm gì cả)

with open("someFile", "rU") as aFile: 
    # process the file 
    pass 
# At this point, the file was closed by the with statement. 
# Bonus, it's also out of scope of the with statement, 
# and eligible for GC. 
+0

Đó cũng là điều tôi đã giả định. Nhưng trên OS X trong Python 2.5.1, các dòng mã mà tôi đã đăng khiến trình thông dịch Python giải phóng tệp (đã được xác minh trong Trình giám sát hoạt động). –

+0

Python được cho là đóng tập tin khi nó được thu thập. Tôi đã xem xét cho nơi này xảy ra trong fileobject.c, nhưng nó không có ở đó. Nó có thể là một nơi nào đó trong cơ chế gc, đó là nơi tôi đang tìm kiếm tiếp theo. Tôi thích câu hỏi này. –

+0

Có vẻ như tôi đã bỏ lỡ nó trong fileobject.c (xem Gallagher). Tôi thực sự muốn tôi có một sự hiểu biết tốt hơn về interny CPython. –

0

Phán đoán sát nhất là vì các loại tập tin là một built-in loại, thông dịch viên tự xử lý việc đóng tập tin vào bộ sưu tập rác.

Ngoài ra, bạn chỉ kiểm tra sau khi trình thông dịch python đã thoát, và tất cả các trình xử lý tệp "bị rò rỉ" đều bị đóng.

+0

Sự hiểu biết của tôi về "kiểu nguyên thủy" (nhận được từ Java) không để lại tệp dưới dạng nguyên thủy, vì không có nguyên thủy trong Python. –

+1

Tôi nghĩ rằng HUAGHAGUAH có nghĩa là để nói "được xây dựng trong loại." :) –

2

Python sử dụng tính toán tham chiếu và hủy diệt xác định ngoài việc thu gom rác thải. Khi không có thêm tham chiếu đến một đối tượng, đối tượng được phát hành ngay lập tức. Phát hành một tập tin sẽ đóng nó lại.

Điều này khác với ví dụ: Java, nơi chỉ có bộ sưu tập rác không xác định. Điều này có nghĩa là bạn không biết khi nào đối tượng được phát hành, vì vậy bạn sẽ phải đóng tệp theo cách thủ công.

Lưu ý rằng tính tham chiếu không hoàn hảo. Bạn có thể có các đối tượng với tham chiếu vòng tròn, mà không thể truy cập từ progam. Đó là lý do tại sao Python có bộ sưu tập rác ngoài việc đếm tham chiếu.

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