https://github.com/python/cpython/commit/35908265b09ac39b67116bfdfe8a053be09e6d8f
commit: 35908265b09ac39b67116bfdfe8a053be09e6d8f
branch: main
author: Mark Byrne <[email protected]>
committer: serhiy-storchaka <[email protected]>
date: 2025-11-12T10:20:55+02:00
summary:
gh-75593: Add support of bytes and path-like paths in wave.open() (GH-140951)
files:
A Misc/NEWS.d/next/Library/2025-11-04-12-16-13.gh-issue-75593.EFVhKR.rst
M Doc/library/wave.rst
M Lib/test/test_wave.py
M Lib/wave.py
diff --git a/Doc/library/wave.rst b/Doc/library/wave.rst
index a3f5bfd5e2f99c..7ff2c97992c4e3 100644
--- a/Doc/library/wave.rst
+++ b/Doc/library/wave.rst
@@ -25,8 +25,9 @@ The :mod:`wave` module defines the following function and
exception:
.. function:: open(file, mode=None)
- If *file* is a string, open the file by that name, otherwise treat it as a
- file-like object. *mode* can be:
+ If *file* is a string, a :term:`path-like object` or a
+ :term:`bytes-like object` open the file by that name, otherwise treat it as
+ a file-like object. *mode* can be:
``'rb'``
Read only mode.
@@ -52,6 +53,10 @@ The :mod:`wave` module defines the following function and
exception:
.. versionchanged:: 3.4
Added support for unseekable files.
+ .. versionchanged:: 3.15
+ Added support for :term:`path-like objects <path-like object>`
+ and :term:`bytes-like objects <bytes-like object>`.
+
.. exception:: Error
An error raised when something is impossible because it violates the WAV
diff --git a/Lib/test/test_wave.py b/Lib/test/test_wave.py
index 226b1aa84bd73c..4c21f16553775c 100644
--- a/Lib/test/test_wave.py
+++ b/Lib/test/test_wave.py
@@ -1,9 +1,11 @@
import unittest
from test import audiotests
from test import support
+from test.support.os_helper import FakePath
import io
import os
import struct
+import tempfile
import sys
import wave
@@ -206,5 +208,25 @@ def test_open_in_write_raises(self):
self.assertIsNone(cm.unraisable)
+class WaveOpen(unittest.TestCase):
+ def test_open_pathlike(self):
+ """It is possible to use `wave.read` and `wave.write` with a path-like
object"""
+ with tempfile.NamedTemporaryFile(delete_on_close=False) as fp:
+ cases = (
+ FakePath(fp.name),
+ FakePath(os.fsencode(fp.name)),
+ os.fsencode(fp.name),
+ )
+ for fake_path in cases:
+ with self.subTest(fake_path):
+ with wave.open(fake_path, 'wb') as f:
+ f.setnchannels(1)
+ f.setsampwidth(2)
+ f.setframerate(44100)
+
+ with wave.open(fake_path, 'rb') as f:
+ pass
+
+
if __name__ == '__main__':
unittest.main()
diff --git a/Lib/wave.py b/Lib/wave.py
index 5af745e2217ec3..056bd6aab7ffa3 100644
--- a/Lib/wave.py
+++ b/Lib/wave.py
@@ -69,6 +69,7 @@
from collections import namedtuple
import builtins
+import os
import struct
import sys
@@ -274,7 +275,7 @@ def initfp(self, file):
def __init__(self, f):
self._i_opened_the_file = None
- if isinstance(f, str):
+ if isinstance(f, (bytes, str, os.PathLike)):
f = builtins.open(f, 'rb')
self._i_opened_the_file = f
# else, assume it is an open file object already
@@ -431,7 +432,7 @@ class Wave_write:
def __init__(self, f):
self._i_opened_the_file = None
- if isinstance(f, str):
+ if isinstance(f, (bytes, str, os.PathLike)):
f = builtins.open(f, 'wb')
self._i_opened_the_file = f
try:
diff --git
a/Misc/NEWS.d/next/Library/2025-11-04-12-16-13.gh-issue-75593.EFVhKR.rst
b/Misc/NEWS.d/next/Library/2025-11-04-12-16-13.gh-issue-75593.EFVhKR.rst
new file mode 100644
index 00000000000000..9a31af9c110454
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-11-04-12-16-13.gh-issue-75593.EFVhKR.rst
@@ -0,0 +1 @@
+Add support of :term:`path-like objects <path-like object>` and
:term:`bytes-like objects <bytes-like object>` in :func:`wave.open`.
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]