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

Skip to content

Commit 51a4370

Browse files
Issue #22217: Implemented reprs of classes in the zipfile module.
1 parent 659dd62 commit 51a4370

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

Lib/test/test_zipfile.py

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -326,6 +326,37 @@ def test_truncated_zipfile(self):
326326
while zipopen.read1(100):
327327
pass
328328

329+
def test_repr(self):
330+
fname = 'file.name'
331+
for f in get_files(self):
332+
with zipfile.ZipFile(f, 'w', self.compression) as zipfp:
333+
zipfp.write(TESTFN, fname)
334+
r = repr(zipfp)
335+
self.assertIn("mode='w'", r)
336+
337+
with zipfile.ZipFile(f, 'r') as zipfp:
338+
r = repr(zipfp)
339+
if isinstance(f, str):
340+
self.assertIn('filename=%r' % f, r)
341+
else:
342+
self.assertIn('file=%r' % f, r)
343+
self.assertIn("mode='r'", r)
344+
r = repr(zipfp.getinfo(fname))
345+
self.assertIn('filename=%r' % fname, r)
346+
self.assertIn('filemode=', r)
347+
self.assertIn('file_size=', r)
348+
if self.compression != zipfile.ZIP_STORED:
349+
self.assertIn('compress_type=', r)
350+
self.assertIn('compress_size=', r)
351+
with zipfp.open(fname) as zipopen:
352+
r = repr(zipopen)
353+
self.assertIn('name=%r' % fname, r)
354+
self.assertIn("mode='r'", r)
355+
if self.compression != zipfile.ZIP_STORED:
356+
self.assertIn('compress_type=', r)
357+
self.assertIn('[closed]', repr(zipopen))
358+
self.assertIn('[closed]', repr(zipfp))
359+
329360
def tearDown(self):
330361
unlink(TESTFN)
331362
unlink(TESTFN2)

Lib/zipfile.py

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -355,6 +355,28 @@ def __init__(self, filename="NoName", date_time=(1980,1,1,0,0,0)):
355355
# compress_size Size of the compressed file
356356
# file_size Size of the uncompressed file
357357

358+
def __repr__(self):
359+
result = ['<%s filename=%r' % (self.__class__.__name__, self.filename)]
360+
if self.compress_type != ZIP_STORED:
361+
result.append(' compress_type=%s' %
362+
compressor_names.get(self.compress_type,
363+
self.compress_type))
364+
hi = self.external_attr >> 16
365+
lo = self.external_attr & 0xFFFF
366+
if hi:
367+
result.append(' filemode=%r' % stat.filemode(hi))
368+
if lo:
369+
result.append(' external_attr=%#x' % lo)
370+
isdir = self.filename[-1:] == '/'
371+
if not isdir or self.file_size:
372+
result.append(' file_size=%r' % self.file_size)
373+
if ((not isdir or self.compress_size) and
374+
(self.compress_type != ZIP_STORED or
375+
self.file_size != self.compress_size)):
376+
result.append(' compress_size=%r' % self.compress_size)
377+
result.append('>')
378+
return ''.join(result)
379+
358380
def FileHeader(self, zip64=None):
359381
"""Return the per-file header as a string."""
360382
dt = self.date_time
@@ -671,6 +693,20 @@ def __init__(self, fileobj, mode, zipinfo, decrypter=None,
671693
else:
672694
self._expected_crc = None
673695

696+
def __repr__(self):
697+
result = ['<%s.%s' % (self.__class__.__module__,
698+
self.__class__.__qualname__)]
699+
if not self.closed:
700+
result.append(' name=%r mode=%r' % (self.name, self.mode))
701+
if self._compress_type != ZIP_STORED:
702+
result.append(' compress_type=%s' %
703+
compressor_names.get(self._compress_type,
704+
self._compress_type))
705+
else:
706+
result.append(' [closed]')
707+
result.append('>')
708+
return ''.join(result)
709+
674710
def readline(self, limit=-1):
675711
"""Read and return a line from the stream.
676712
@@ -967,6 +1003,20 @@ def __enter__(self):
9671003
def __exit__(self, type, value, traceback):
9681004
self.close()
9691005

1006+
def __repr__(self):
1007+
result = ['<%s.%s' % (self.__class__.__module__,
1008+
self.__class__.__qualname__)]
1009+
if self.fp is not None:
1010+
if self._filePassed:
1011+
result.append(' file=%r' % self.fp)
1012+
elif self.filename is not None:
1013+
result.append(' filename=%r' % self.filename)
1014+
result.append(' mode=%r' % self.mode)
1015+
else:
1016+
result.append(' [closed]')
1017+
result.append('>')
1018+
return ''.join(result)
1019+
9701020
def _RealGetContents(self):
9711021
"""Read in the table of contents for the ZIP file."""
9721022
fp = self.fp

Misc/NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ Core and Builtins
181181
Library
182182
-------
183183

184+
- Issue #22217: Implemented reprs of classes in the zipfile module.
185+
184186
- Issue #18216: gettext now raises an error when a .mo file has an
185187
unsupported major version number. Patch by Aaron Hill.
186188

0 commit comments

Comments
 (0)