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]

Reply via email to