En Sat, 21 Mar 2009 23:58:07 -0300, <lamber...@corning.com> escribió:

'''
    A python 3 question.
    Presume this code is in file p.py.
    The program fails.

        $ python3 p.py
        ...
        ValueError: I/O operation on closed file.

    Removing the comment character to increase the stream
    reference count fixes the program, at the expense of
    an extra TextIOWrapper object.

    Please, what is a better way to write the class with
    regard to this issue?
'''

import re
import io

class file(io.TextIOWrapper):

    '''
        Enhance TextIO.  Streams have many sources,
        a file name is insufficient.
    '''

    def __init__(self,stream):
        #self.stream = stream
        super().__init__(stream.buffer)


print(file(open('p.py')).read())

You're taking a shortcut (the open() builtin) that isn't valid here.

open() creates a "raw" FileIO object, then a BufferedReader, and finally returns a TextIOWrapper. Each of those has a reference to the previous object, and delegates many calls to it. In particular, close() propagates down to FileIO to close the OS file descriptor.

In your example, you call open() to create a TextIOWrapper object that is discarded as soon as the open() call finishes - because you only hold a reference to the intermediate buffer. The destructor calls close(), and the underlying OS file descriptor is closed.

So, if you're not interested in the TextIOWrapper object, don't create it in the first place. That means, don't use the open() shortcut and build the required pieces yourself.

---

There is another alternative that relies on undocumented behaviour: use open to create a *binary* file and wrap the resulting BufferedReader object in your own TextIOWrapper.

import io

class file(io.TextIOWrapper):
     def __init__(self, buffer):
         super().__init__(buffer)

print(file(open('p.py','rb')).read())

--
Gabriel Genellina

--
http://mail.python.org/mailman/listinfo/python-list

Reply via email to