From d1ba7081e2f5e997fd94fc4fb89a21448c876fe5 Mon Sep 17 00:00:00 2001 From: htjworld <116538001+htjworld@users.noreply.github.com> Date: Sun, 3 May 2026 11:10:03 +0900 Subject: [PATCH 1/2] gh-149306: Improve error messages in wave module to include the offending value Include the offending value in wave.Error messages raised by Wave_read._read_fmt_chunk and Wave_write setters (setnchannels, setsampwidth, setframerate). For setframerate, the original value is shown rather than the rounded one to aid debugging. --- Lib/test/test_wave.py | 35 +++++++++++++++++-- Lib/wave.py | 21 +++++------ ...-05-03-11-09-48.gh-issue-149306.jvi7uE.rst | 2 ++ 3 files changed, 46 insertions(+), 12 deletions(-) create mode 100644 Misc/NEWS.d/next/Library/2026-05-03-11-09-48.gh-issue-149306.jvi7uE.rst diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index d3723c04820d9d..9ad8f6862acaa2 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -4,6 +4,7 @@ from test.support.os_helper import FakePath, unlink import io import os +import re import struct import tempfile import sys @@ -323,14 +324,14 @@ def test_read_wrong_number_of_channels(self): b = b'RIFF' + struct.pack(' 4: - raise Error('bad sample width') + raise Error(f'bad sample width: {sampwidth!r}') self._sampwidth = sampwidth def getsampwidth(self): @@ -521,10 +522,10 @@ def getsampwidth(self): def setframerate(self, framerate): if self._datawritten: raise Error('cannot change parameters after starting to write') - framerate = int(round(framerate)) - if framerate <= 0: - raise Error('bad frame rate') - self._framerate = framerate + rounded = int(round(framerate)) + if rounded <= 0: + raise Error(f'bad frame rate: {framerate!r}') + self._framerate = rounded def getframerate(self): if not self._framerate: diff --git a/Misc/NEWS.d/next/Library/2026-05-03-11-09-48.gh-issue-149306.jvi7uE.rst b/Misc/NEWS.d/next/Library/2026-05-03-11-09-48.gh-issue-149306.jvi7uE.rst new file mode 100644 index 00000000000000..cff46aa60d0ff7 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2026-05-03-11-09-48.gh-issue-149306.jvi7uE.rst @@ -0,0 +1,2 @@ +Error messages in :mod:`wave` for invalid channel count, sample width, and +frame rate now include the offending value. From 2d4c5e43537292b5cb02ecb7e7f878a7e8deb868 Mon Sep 17 00:00:00 2001 From: htjworld <116538001+htjworld@users.noreply.github.com> Date: Sun, 3 May 2026 21:01:29 +0900 Subject: [PATCH 2/2] Address review: revert _read_fmt_chunk unpack, rename rounded_framerate, extract test messages --- Lib/test/test_wave.py | 12 ++++++------ Lib/wave.py | 13 ++++++------- 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py index 9ad8f6862acaa2..9067eb9c7d9f18 100644 --- a/Lib/test/test_wave.py +++ b/Lib/test/test_wave.py @@ -433,30 +433,30 @@ def test_setframerate_rounds(self, arg, expected): @support.subTests('nchannels', (0, -1)) def test_setnchannels_error_includes_value(self, nchannels): + msg = re.escape(f'bad # of channels: {nchannels!r}') with wave.open(io.BytesIO(), 'wb') as f: - with self.assertRaisesRegex(wave.Error, - re.escape(f'bad # of channels: {nchannels!r}')): + with self.assertRaisesRegex(wave.Error, msg): f.setnchannels(nchannels) with self.assertRaises(wave.Error): f.close() @support.subTests('sampwidth', (0, 5)) def test_setsampwidth_error_includes_value(self, sampwidth): + msg = re.escape(f'bad sample width: {sampwidth!r}') with wave.open(io.BytesIO(), 'wb') as f: f.setnchannels(1) - with self.assertRaisesRegex(wave.Error, - re.escape(f'bad sample width: {sampwidth!r}')): + with self.assertRaisesRegex(wave.Error, msg): f.setsampwidth(sampwidth) with self.assertRaises(wave.Error): f.close() @support.subTests('arg', (-1, 0, 0.4)) def test_setframerate_error_includes_value(self, arg): + msg = re.escape(f'bad frame rate: {arg!r}') with wave.open(io.BytesIO(), 'wb') as f: f.setnchannels(1) f.setsampwidth(2) - with self.assertRaisesRegex(wave.Error, - re.escape(f'bad frame rate: {arg!r}')): + with self.assertRaisesRegex(wave.Error, msg): f.setframerate(arg) with self.assertRaises(wave.Error): f.close() diff --git a/Lib/wave.py b/Lib/wave.py index b0f58179eb34a7..961f3efb3dd8db 100644 --- a/Lib/wave.py +++ b/Lib/wave.py @@ -388,7 +388,7 @@ def readframes(self, nframes): def _read_fmt_chunk(self, chunk): try: - self._format, nchannels, self._framerate, dwAvgBytesPerSec, wBlockAlign = struct.unpack_from('