gh-57141: Make shallow argument to filecmp.dircmp keyword-only (#121767)

It is our general practice to make new optional parameters keyword-only,
even if the existing parameters are all positional-or-keyword. Passing
this parameter as positional would look confusing and could be error-prone
if additional parameters are added in the future.
This commit is contained in:
Jelle Zijlstra 2024-07-14 15:53:32 -07:00 committed by GitHub
parent 7982363b47
commit 50eec501fe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 18 additions and 4 deletions

View File

@ -70,7 +70,7 @@ The :mod:`filecmp` module defines the following functions:
The :class:`dircmp` class The :class:`dircmp` class
------------------------- -------------------------
.. class:: dircmp(a, b, ignore=None, hide=None, shallow=True) .. class:: dircmp(a, b, ignore=None, hide=None, *, shallow=True)
Construct a new directory comparison object, to compare the directories *a* Construct a new directory comparison object, to compare the directories *a*
and *b*. *ignore* is a list of names to ignore, and defaults to and *b*. *ignore* is a list of names to ignore, and defaults to

View File

@ -88,7 +88,7 @@ def _do_cmp(f1, f2):
class dircmp: class dircmp:
"""A class that manages the comparison of 2 directories. """A class that manages the comparison of 2 directories.
dircmp(a, b, ignore=None, hide=None, shallow=True) dircmp(a, b, ignore=None, hide=None, *, shallow=True)
A and B are directories. A and B are directories.
IGNORE is a list of names to ignore, IGNORE is a list of names to ignore,
defaults to DEFAULT_IGNORES. defaults to DEFAULT_IGNORES.
@ -124,7 +124,7 @@ class dircmp:
in common_dirs. in common_dirs.
""" """
def __init__(self, a, b, ignore=None, hide=None, shallow=True): # Initialize def __init__(self, a, b, ignore=None, hide=None, *, shallow=True): # Initialize
self.left = a self.left = a
self.right = b self.right = b
if hide is None: if hide is None:
@ -201,7 +201,7 @@ class dircmp:
a_x = os.path.join(self.left, x) a_x = os.path.join(self.left, x)
b_x = os.path.join(self.right, x) b_x = os.path.join(self.right, x)
self.subdirs[x] = self.__class__(a_x, b_x, self.ignore, self.hide, self.subdirs[x] = self.__class__(a_x, b_x, self.ignore, self.hide,
self.shallow) shallow=self.shallow)
def phase4_closure(self): # Recursively call phase4() on subdirectories def phase4_closure(self): # Recursively call phase4() on subdirectories
self.phase4() self.phase4()

View File

@ -1,5 +1,6 @@
import filecmp import filecmp
import os import os
import re
import shutil import shutil
import tempfile import tempfile
import unittest import unittest
@ -277,6 +278,17 @@ class DirCompareTestCase(unittest.TestCase):
] ]
self._assert_report(d.report, expected_report) self._assert_report(d.report, expected_report)
def test_dircmp_shallow_is_keyword_only(self):
with self.assertRaisesRegex(
TypeError,
re.escape("dircmp.__init__() takes from 3 to 5 positional arguments but 6 were given"),
):
filecmp.dircmp(self.dir, self.dir_same, None, None, True)
self.assertIsInstance(
filecmp.dircmp(self.dir, self.dir_same, None, None, shallow=True),
filecmp.dircmp,
)
def test_dircmp_subdirs_type(self): def test_dircmp_subdirs_type(self):
"""Check that dircmp.subdirs respects subclassing.""" """Check that dircmp.subdirs respects subclassing."""
class MyDirCmp(filecmp.dircmp): class MyDirCmp(filecmp.dircmp):

View File

@ -0,0 +1,2 @@
The *shallow* argument to :class:`filecmp.dircmp` (new in Python 3.13) is
now keyword-only.