bpo-31985: Deprecate openfp in aifc, sunau, and wave (#4344)

The openfp functions of aifp, sunau, and wave had pointed to the open
function of each module since 1993 as a matter of backwards
compatibility. In the case of aifc.openfp, it was both undocumented
and untested. This change begins the formal deprecation of those
openfp functions, with their removal coming in 3.9.

This additionally adds a TODO in test_pyclbr around using aifc.openfp,
though it shouldn't be changed until removal in 3.9.
This commit is contained in:
Brian Curtin 2017-11-10 11:38:25 -05:00 committed by GitHub
parent 5e0df74b3b
commit 9f914a01af
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
12 changed files with 48 additions and 6 deletions

View File

@ -63,6 +63,8 @@ The :mod:`sunau` module defines the following functions:
A synonym for :func:`.open`, maintained for backwards compatibility.
.. deprecated-removed:: 3.7 3.9
The :mod:`sunau` module defines the following exception:

View File

@ -51,6 +51,8 @@ The :mod:`wave` module defines the following function and exception:
A synonym for :func:`.open`, maintained for backwards compatibility.
.. deprecated-removed:: 3.7 3.9
.. exception:: Error

View File

@ -915,7 +915,10 @@ def open(f, mode=None):
else:
raise Error("mode must be 'r', 'rb', 'w', or 'wb'")
openfp = open # B/W compatibility
def openfp(f, mode=None):
warnings.warn("aifc.openfp is deprecated since Python 3.7. "
"Use aifc.open instead.", DeprecationWarning, stacklevel=2)
return open(f, mode=mode)
if __name__ == '__main__':
import sys

View File

@ -160,7 +160,7 @@ def test_wav(h, f):
return None
f.seek(0)
try:
w = wave.openfp(f, 'r')
w = wave.open(f, 'r')
except (EOFError, wave.Error):
return None
return ('wav', w.getframerate(), w.getnchannels(),

View File

@ -104,6 +104,7 @@ is destroyed.
"""
from collections import namedtuple
import warnings
_sunau_params = namedtuple('_sunau_params',
'nchannels sampwidth framerate nframes comptype compname')
@ -522,4 +523,7 @@ def open(f, mode=None):
else:
raise Error("mode must be 'r', 'rb', 'w', or 'wb'")
openfp = open
def openfp(f, mode=None):
warnings.warn("sunau.openfp is deprecated since Python 3.7. "
"Use sunau.open instead.", DeprecationWarning, stacklevel=2)
return open(f, mode=mode)

View File

@ -1,6 +1,7 @@
from test.support import findfile, TESTFN, unlink
import array
import io
from unittest import mock
import pickle
@ -49,6 +50,17 @@ class AudioTests:
self.assertEqual(pickle.loads(dump), params)
class AudioMiscTests(AudioTests):
def test_openfp_deprecated(self):
arg = "arg"
mode = "mode"
with mock.patch(f"{self.module.__name__}.open") as mock_open, \
self.assertWarns(DeprecationWarning):
self.module.openfp(arg, mode=mode)
mock_open.assert_called_with(arg, mode=mode)
class AudioWriteTests(AudioTests):
def create_file(self, testfile):

View File

@ -7,6 +7,7 @@ import io
import sys
import struct
import aifc
import warnings
class AifcTest(audiotests.AudioWriteTests,
@ -144,7 +145,9 @@ class AifcALAWTest(AifcTest, unittest.TestCase):
frames = byteswap(frames, 2)
class AifcMiscTest(audiotests.AudioTests, unittest.TestCase):
class AifcMiscTest(audiotests.AudioMiscTests, unittest.TestCase):
module = aifc
def test_skipunknown(self):
#Issue 2245
#This file contains chunk types aifc doesn't recognize.

View File

@ -223,6 +223,8 @@ class PyclbrTest(TestCase):
cm('random', ignore=('Random',)) # from _random import Random as CoreGenerator
cm('cgi', ignore=('log',)) # set with = in module
cm('pickle', ignore=('partial',))
# TODO(briancurtin): openfp is deprecated as of 3.7.
# Update this once it has been removed.
cm('aifc', ignore=('openfp', '_aifc_params')) # set with = in module
cm('sre_parse', ignore=('dump', 'groups', 'pos')) # from sre_constants import *; property
cm('pdb')

View File

@ -117,5 +117,9 @@ class SunauULAWTest(SunauTest, unittest.TestCase):
frames = byteswap(frames, 2)
class SunauMiscTests(audiotests.AudioMiscTests, unittest.TestCase):
module = sunau
if __name__ == "__main__":
unittest.main()

View File

@ -103,7 +103,9 @@ class WavePCM32Test(WaveTest, unittest.TestCase):
frames = byteswap(frames, 4)
class MiscTestCase(unittest.TestCase):
class MiscTestCase(audiotests.AudioMiscTests, unittest.TestCase):
module = wave
def test__all__(self):
blacklist = {'WAVE_FORMAT_PCM'}
support.check__all__(self, wave, blacklist=blacklist)

View File

@ -87,6 +87,7 @@ import struct
import sys
from chunk import Chunk
from collections import namedtuple
import warnings
_wave_params = namedtuple('_wave_params',
'nchannels sampwidth framerate nframes comptype compname')
@ -502,4 +503,7 @@ def open(f, mode=None):
else:
raise Error("mode must be 'r', 'rb', 'w', or 'wb'")
openfp = open # B/W compatibility
def openfp(f, mode=None):
warnings.warn("wave.openfp is deprecated since Python 3.7. "
"Use wave.open instead.", DeprecationWarning, stacklevel=2)
return open(f, mode=mode)

View File

@ -0,0 +1,4 @@
Formally deprecated aifc.openfp, sunau.openfp, and wave.openfp. Since change
7bc817d5ba917528e8bd07ec461c635291e7b06a in 1993, openfp in each of the three
modules had been pointing to that module's open funciton as a matter of
backwards compatibility, though it had been both untested and undocumented.