#17616: wave.open now supports the 'with' statement.
Feature and tests by ClClaudiu.Popa, I added the doc changes.
This commit is contained in:
parent
0ce642ebca
commit
c91d5eea10
|
@ -51,7 +51,8 @@ Module :mod:`aifc` defines the following function:
|
|||
used for writing, the file object should be seekable, unless you know ahead of
|
||||
time how many samples you are going to write in total and use
|
||||
:meth:`writeframesraw` and :meth:`setnframes`.
|
||||
Objects returned by :func:`.open` also supports the :keyword:`with` statement.
|
||||
The :func:`.open` function may be used in a :keyword:`with` statement. When
|
||||
the :keyword:`with` block completes, the :meth:`~aifc.close` method is called.
|
||||
|
||||
.. versionchanged:: 3.4
|
||||
Support for the :keyword:`with` statement was added.
|
||||
|
|
|
@ -39,6 +39,11 @@ The :mod:`wave` module defines the following function and exception:
|
|||
:meth:`close` method is called; it is the caller's responsibility to close
|
||||
the file object.
|
||||
|
||||
The :func:`.open` function may be used in a :keyword:`with` statement. When
|
||||
the :keyword:`with` block completes, the :meth:`Wave_read.close()
|
||||
<wave.Wave_read.close>` or :meth:`Wave_write.close()
|
||||
<wave.Wave_write.close()>` method is called.
|
||||
|
||||
|
||||
.. function:: openfp(file, mode)
|
||||
|
||||
|
|
|
@ -239,8 +239,11 @@ wave
|
|||
The :meth:`~wave.getparams` method now returns a namedtuple rather than a
|
||||
plain tuple. (Contributed by Claudiu Popa in :issue:`17487`.)
|
||||
|
||||
:meth:`wave.open` now supports the context manager protocol. (Contributed
|
||||
by Claudiu Popa in :issue:`17616`.)
|
||||
|
||||
stat
|
||||
---
|
||||
----
|
||||
|
||||
The stat module is now backed by a C implementation in :mod:`_stat`. A C
|
||||
implementation is required as most of the values aren't standardized and
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
from test.support import TESTFN, run_unittest
|
||||
import os
|
||||
from test.support import TESTFN, unlink
|
||||
import wave
|
||||
import struct
|
||||
import unittest
|
||||
|
||||
nchannels = 2
|
||||
|
@ -17,10 +15,7 @@ class TestWave(unittest.TestCase):
|
|||
def tearDown(self):
|
||||
if self.f is not None:
|
||||
self.f.close()
|
||||
try:
|
||||
os.remove(TESTFN)
|
||||
except OSError:
|
||||
pass
|
||||
unlink(TESTFN)
|
||||
|
||||
def test_it(self, test_rounding=False):
|
||||
self.f = wave.open(TESTFN, 'wb')
|
||||
|
@ -74,9 +69,23 @@ class TestWave(unittest.TestCase):
|
|||
self.assertEqual(params.comptype, self.f.getcomptype())
|
||||
self.assertEqual(params.compname, self.f.getcompname())
|
||||
|
||||
def test_context_manager(self):
|
||||
self.f = wave.open(TESTFN, 'wb')
|
||||
self.f.setnchannels(nchannels)
|
||||
self.f.setsampwidth(sampwidth)
|
||||
self.f.setframerate(framerate)
|
||||
self.f.close()
|
||||
|
||||
with wave.open(TESTFN) as f:
|
||||
self.assertFalse(f.getfp().closed)
|
||||
self.assertIs(f.getfp(), None)
|
||||
|
||||
with open(TESTFN, 'wb') as testfile:
|
||||
with self.assertRaises(wave.Error):
|
||||
with wave.open(testfile, 'wb'):
|
||||
pass
|
||||
self.assertEqual(testfile.closed, False)
|
||||
|
||||
def test_main():
|
||||
run_unittest(TestWave)
|
||||
|
||||
if __name__ == '__main__':
|
||||
test_main()
|
||||
unittest.main()
|
||||
|
|
13
Lib/wave.py
13
Lib/wave.py
|
@ -167,6 +167,13 @@ class Wave_read:
|
|||
|
||||
def __del__(self):
|
||||
self.close()
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *args):
|
||||
self.close()
|
||||
|
||||
#
|
||||
# User visible methods.
|
||||
#
|
||||
|
@ -323,6 +330,12 @@ class Wave_write:
|
|||
def __del__(self):
|
||||
self.close()
|
||||
|
||||
def __enter__(self):
|
||||
return self
|
||||
|
||||
def __exit__(self, *args):
|
||||
self.close()
|
||||
|
||||
#
|
||||
# User visible methods.
|
||||
#
|
||||
|
|
Loading…
Reference in New Issue