Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 40e8246

Browse files
committed
Fix for bug 4362 "FileIO object in io module"; Patch by amaury.forgeotdarc.
1 parent 91cc8fb commit 40e8246

2 files changed

Lines changed: 47 additions & 10 deletions

File tree

Lib/io.py

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -239,8 +239,6 @@ def open(file, mode="r", buffering=None, encoding=None, errors=None,
239239
raise ValueError("invalid buffering size")
240240
if buffering == 0:
241241
if binary:
242-
raw._name = file
243-
raw._mode = mode
244242
return raw
245243
raise ValueError("can't have unbuffered text I/O")
246244
if updating:
@@ -252,11 +250,8 @@ def open(file, mode="r", buffering=None, encoding=None, errors=None,
252250
else:
253251
raise ValueError("unknown mode: %r" % mode)
254252
if binary:
255-
buffer.name = file
256-
buffer.mode = mode
257253
return buffer
258254
text = TextIOWrapper(buffer, encoding, errors, newline, line_buffering)
259-
text.name = file
260255
text.mode = mode
261256
return text
262257

@@ -616,6 +611,10 @@ class FileIO(_fileio._FileIO, RawIOBase):
616611
# that _fileio._FileIO inherits from io.RawIOBase (which would be hard
617612
# to do since _fileio.c is written in C).
618613

614+
def __init__(self, name, mode="r", closefd=True):
615+
_fileio._FileIO.__init__(self, name, mode, closefd)
616+
self._name = name
617+
619618
def close(self):
620619
_fileio._FileIO.close(self)
621620
RawIOBase.close(self)
@@ -624,11 +623,6 @@ def close(self):
624623
def name(self):
625624
return self._name
626625

627-
# XXX(gb): _FileIO already has a mode property
628-
@property
629-
def mode(self):
630-
return self._mode
631-
632626

633627
class BufferedIOBase(IOBase):
634628

@@ -762,6 +756,14 @@ def writable(self):
762756
def closed(self):
763757
return self.raw.closed
764758

759+
@property
760+
def name(self):
761+
return self.raw.name
762+
763+
@property
764+
def mode(self):
765+
return self.raw.mode
766+
765767
### Lower-level APIs ###
766768

767769
def fileno(self):
@@ -1464,6 +1466,10 @@ def close(self):
14641466
def closed(self):
14651467
return self.buffer.closed
14661468

1469+
@property
1470+
def name(self):
1471+
return self.buffer.name
1472+
14671473
def fileno(self):
14681474
return self.buffer.fileno()
14691475

Lib/test/test_io.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1249,6 +1249,9 @@ def test_newline_decoder(self):
12491249

12501250
class MiscIOTest(unittest.TestCase):
12511251

1252+
def tearDown(self):
1253+
support.unlink(support.TESTFN)
1254+
12521255
def testImport__all__(self):
12531256
for name in io.__all__:
12541257
obj = getattr(io, name, None)
@@ -1261,6 +1264,34 @@ def testImport__all__(self):
12611264
self.assert_(issubclass(obj, io.IOBase))
12621265

12631266

1267+
def test_attributes(self):
1268+
f = io.open(support.TESTFN, "wb", buffering=0)
1269+
self.assertEquals(f.mode, "w")
1270+
f.close()
1271+
1272+
f = io.open(support.TESTFN, "U")
1273+
self.assertEquals(f.name, support.TESTFN)
1274+
self.assertEquals(f.buffer.name, support.TESTFN)
1275+
self.assertEquals(f.buffer.raw.name, support.TESTFN)
1276+
self.assertEquals(f.mode, "U")
1277+
self.assertEquals(f.buffer.mode, "r")
1278+
self.assertEquals(f.buffer.raw.mode, "r")
1279+
f.close()
1280+
1281+
f = io.open(support.TESTFN, "w+")
1282+
self.assertEquals(f.mode, "w+")
1283+
self.assertEquals(f.buffer.mode, "r+") # Does it really matter?
1284+
self.assertEquals(f.buffer.raw.mode, "r+")
1285+
1286+
g = io.open(f.fileno(), "wb", closefd=False)
1287+
self.assertEquals(g.mode, "w")
1288+
self.assertEquals(g.raw.mode, "w")
1289+
self.assertEquals(g.name, f.fileno())
1290+
self.assertEquals(g.raw.name, f.fileno())
1291+
f.close()
1292+
g.close()
1293+
1294+
12641295
def test_main():
12651296
support.run_unittest(IOTest, BytesIOTest, StringIOTest,
12661297
BufferedReaderTest, BufferedWriterTest,

0 commit comments

Comments
 (0)