Luke Paireepinart, 03.05.2010 12:18:
On Mon, May 3, 2010 at 3:50 AM, Stefan Behnel wrote:
Luke Paireepinart, 03.05.2010 10:27:
I thought they changed for loop interations so that if you did
for line in open('packages.txt'):
     .... etc...

it would automatically close the file handle after the loop terminated.
Have I been wrong this whole time?

Yes. The fact that the file is automatically closed after the loop is an
implementation detail of CPython that does not apply in other Python
implementations.

So why is it an implementation detail?  Why is it not universally like that?

Because it cannot be done like this without implementation details that are inherent to the CPython interpreter, namely: reference counting. The for-loop cannot know where the object reference came from that it is just trying to iterate over. Only after the for-loop dropped the reference, the reference counting mechanism determines that it was the last reference and cleans up the file. When the file is cleaned up, the code in the file object determines that it wasn't closed yet and closes the file. Neither the for-loop, nor the reference-counting mechanism, nor the garbage collector know that this is something that needs to be done. Only the file object knows that.


You never have an explicit reference to the file handle.  When it gets
garbage-collected after the loop it should get rid of the file handle.

But you cannot know when that will be. It is not an implementation detail that the file gets closed when the file object is freed. It *is*, however, an implementation detail, when this freeing happens. It can take an arbitrarily long time, so it is usually in your own interest to close the file yourself, if only to get rid of the file handle. Imagine you had opened the file for writing, such as in

    open("myfile.txt", 'w').write('some text')

Here, you have no guarantee that the text has been written to the file at any point in the runtime of your program. Likely not what you want.


I mean, where is the line between 'implementation details' and
'language features'?

See the docs.


What reason is there to make lists mutable but
strings immutable?

Performance considerations and use case specific design.


Why aren't strings mutable, or lists immutable?

What would be the use case of an immutable list, as opposed to a tuple? How would you use mutable strings in a dictionary?

Stefan

_______________________________________________
Tutor maillist  -  [email protected]
To unsubscribe or change subscription options:
http://mail.python.org/mailman/listinfo/tutor

Reply via email to