mirror of
https://github.com/python/cpython.git
synced 2025-08-22 17:55:18 +00:00
Fix for bug 4362 "FileIO object in io module"; Patch by amaury.forgeotdarc.
This commit is contained in:
parent
91cc8fb92b
commit
40e8246f6a
2 changed files with 47 additions and 10 deletions
26
Lib/io.py
26
Lib/io.py
|
@ -239,8 +239,6 @@ def open(file, mode="r", buffering=None, encoding=None, errors=None,
|
||||||
raise ValueError("invalid buffering size")
|
raise ValueError("invalid buffering size")
|
||||||
if buffering == 0:
|
if buffering == 0:
|
||||||
if binary:
|
if binary:
|
||||||
raw._name = file
|
|
||||||
raw._mode = mode
|
|
||||||
return raw
|
return raw
|
||||||
raise ValueError("can't have unbuffered text I/O")
|
raise ValueError("can't have unbuffered text I/O")
|
||||||
if updating:
|
if updating:
|
||||||
|
@ -252,11 +250,8 @@ def open(file, mode="r", buffering=None, encoding=None, errors=None,
|
||||||
else:
|
else:
|
||||||
raise ValueError("unknown mode: %r" % mode)
|
raise ValueError("unknown mode: %r" % mode)
|
||||||
if binary:
|
if binary:
|
||||||
buffer.name = file
|
|
||||||
buffer.mode = mode
|
|
||||||
return buffer
|
return buffer
|
||||||
text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
|
text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
|
||||||
text.name = file
|
|
||||||
text.mode = mode
|
text.mode = mode
|
||||||
return text
|
return text
|
||||||
|
|
||||||
|
@ -616,6 +611,10 @@ class FileIO(_fileio._FileIO, RawIOBase):
|
||||||
# that _fileio._FileIO inherits from io.RawIOBase (which would be hard
|
# that _fileio._FileIO inherits from io.RawIOBase (which would be hard
|
||||||
# to do since _fileio.c is written in C).
|
# to do since _fileio.c is written in C).
|
||||||
|
|
||||||
|
def __init__(self, name, mode="r", closefd=True):
|
||||||
|
_fileio._FileIO.__init__(self, name, mode, closefd)
|
||||||
|
self._name = name
|
||||||
|
|
||||||
def close(self):
|
def close(self):
|
||||||
_fileio._FileIO.close(self)
|
_fileio._FileIO.close(self)
|
||||||
RawIOBase.close(self)
|
RawIOBase.close(self)
|
||||||
|
@ -624,11 +623,6 @@ class FileIO(_fileio._FileIO, RawIOBase):
|
||||||
def name(self):
|
def name(self):
|
||||||
return self._name
|
return self._name
|
||||||
|
|
||||||
# XXX(gb): _FileIO already has a mode property
|
|
||||||
@property
|
|
||||||
def mode(self):
|
|
||||||
return self._mode
|
|
||||||
|
|
||||||
|
|
||||||
class BufferedIOBase(IOBase):
|
class BufferedIOBase(IOBase):
|
||||||
|
|
||||||
|
@ -762,6 +756,14 @@ class _BufferedIOMixin(BufferedIOBase):
|
||||||
def closed(self):
|
def closed(self):
|
||||||
return self.raw.closed
|
return self.raw.closed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
return self.raw.name
|
||||||
|
|
||||||
|
@property
|
||||||
|
def mode(self):
|
||||||
|
return self.raw.mode
|
||||||
|
|
||||||
### Lower-level APIs ###
|
### Lower-level APIs ###
|
||||||
|
|
||||||
def fileno(self):
|
def fileno(self):
|
||||||
|
@ -1464,6 +1466,10 @@ class TextIOWrapper(TextIOBase):
|
||||||
def closed(self):
|
def closed(self):
|
||||||
return self.buffer.closed
|
return self.buffer.closed
|
||||||
|
|
||||||
|
@property
|
||||||
|
def name(self):
|
||||||
|
return self.buffer.name
|
||||||
|
|
||||||
def fileno(self):
|
def fileno(self):
|
||||||
return self.buffer.fileno()
|
return self.buffer.fileno()
|
||||||
|
|
||||||
|
|
|
@ -1249,6 +1249,9 @@ class TextIOWrapperTest(unittest.TestCase):
|
||||||
|
|
||||||
class MiscIOTest(unittest.TestCase):
|
class MiscIOTest(unittest.TestCase):
|
||||||
|
|
||||||
|
def tearDown(self):
|
||||||
|
support.unlink(support.TESTFN)
|
||||||
|
|
||||||
def testImport__all__(self):
|
def testImport__all__(self):
|
||||||
for name in io.__all__:
|
for name in io.__all__:
|
||||||
obj = getattr(io, name, None)
|
obj = getattr(io, name, None)
|
||||||
|
@ -1261,6 +1264,34 @@ class MiscIOTest(unittest.TestCase):
|
||||||
self.assert_(issubclass(obj, io.IOBase))
|
self.assert_(issubclass(obj, io.IOBase))
|
||||||
|
|
||||||
|
|
||||||
|
def test_attributes(self):
|
||||||
|
f = io.open(support.TESTFN, "wb", buffering=0)
|
||||||
|
self.assertEquals(f.mode, "w")
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
f = io.open(support.TESTFN, "U")
|
||||||
|
self.assertEquals(f.name, support.TESTFN)
|
||||||
|
self.assertEquals(f.buffer.name, support.TESTFN)
|
||||||
|
self.assertEquals(f.buffer.raw.name, support.TESTFN)
|
||||||
|
self.assertEquals(f.mode, "U")
|
||||||
|
self.assertEquals(f.buffer.mode, "r")
|
||||||
|
self.assertEquals(f.buffer.raw.mode, "r")
|
||||||
|
f.close()
|
||||||
|
|
||||||
|
f = io.open(support.TESTFN, "w+")
|
||||||
|
self.assertEquals(f.mode, "w+")
|
||||||
|
self.assertEquals(f.buffer.mode, "r+") # Does it really matter?
|
||||||
|
self.assertEquals(f.buffer.raw.mode, "r+")
|
||||||
|
|
||||||
|
g = io.open(f.fileno(), "wb", closefd=False)
|
||||||
|
self.assertEquals(g.mode, "w")
|
||||||
|
self.assertEquals(g.raw.mode, "w")
|
||||||
|
self.assertEquals(g.name, f.fileno())
|
||||||
|
self.assertEquals(g.raw.name, f.fileno())
|
||||||
|
f.close()
|
||||||
|
g.close()
|
||||||
|
|
||||||
|
|
||||||
def test_main():
|
def test_main():
|
||||||
support.run_unittest(IOTest, BytesIOTest, StringIOTest,
|
support.run_unittest(IOTest, BytesIOTest, StringIOTest,
|
||||||
BufferedReaderTest, BufferedWriterTest,
|
BufferedReaderTest, BufferedWriterTest,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue