gh-134978: deprecate `string` keyword parameter for hash function constructors (#134979)

This commit is contained in:
Bénédikt Tran 2025-06-02 10:25:50 +02:00 committed by GitHub
parent ac7511062b
commit ee65ebdb50
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
6 changed files with 70 additions and 5 deletions

View File

@ -6,3 +6,19 @@ Pending removal in Python 3.19
* Implicitly switching to the MSVC-compatible struct layout by setting
:attr:`~ctypes.Structure._pack_` but not :attr:`~ctypes.Structure._layout_`
on non-Windows platforms.
* :mod:`hashlib`:
- In hash function constructors such as :func:`~hashlib.new` or the
direct hash-named constructors such as :func:`~hashlib.md5` and
:func:`~hashlib.sha256`, their optional initial data parameter could
also be passed a keyword argument named ``data=`` or ``string=`` in
various :mod:`!hashlib` implementations.
Support for the ``string`` keyword argument name is now deprecated
and slated for removal in Python 3.19.
Before Python 3.13, the ``string`` keyword parameter was not correctly
supported depending on the backend implementation of hash functions.
Prefer passing the initial data as a positional argument for maximum
backwards compatibility.

View File

@ -94,6 +94,13 @@ accessible by name via :func:`new`. See :data:`algorithms_available`.
OpenSSL does not provide we fall back to a verified implementation from
the `HACL\* project`_.
.. deprecated-removed:: 3.15 3.19
The undocumented ``string`` keyword parameter in :func:`!_hashlib.new`
and hash-named constructors such as :func:`!_md5.md5` is deprecated.
Prefer passing the initial data as a positional argument for maximum
backwards compatibility.
Usage
-----

View File

@ -146,8 +146,20 @@ module_name
Deprecated
==========
* module_name:
TODO
hashlib
-------
* In hash function constructors such as :func:`~hashlib.new` or the
direct hash-named constructors such as :func:`~hashlib.md5` and
:func:`~hashlib.sha256`, their optional initial data parameter could
also be passed a keyword argument named ``data=`` or ``string=`` in
various :mod:`hashlib` implementations.
Support for the ``string`` keyword argument name is now deprecated and
is slated for removal in Python 3.19. Prefer passing the initial data as
a positional argument for maximum backwards compatibility.
(Contributed by Bénédikt Tran in :gh:`134978`.)
.. Add deprecations above alphabetically, not here at the end.

View File

@ -98,6 +98,14 @@ def read_vectors(hash_name):
yield parts
DEPRECATED_STRING_PARAMETER = re.escape(
"the 'string' keyword parameter is deprecated since "
"Python 3.15 and slated for removal in Python 3.19; "
"use the 'data' keyword parameter or pass the data "
"to hash as a positional argument instead"
)
class HashLibTestCase(unittest.TestCase):
supported_hash_names = ( 'md5', 'MD5', 'sha1', 'SHA1',
'sha224', 'SHA224', 'sha256', 'SHA256',
@ -255,17 +263,23 @@ def test_clinic_signature(self):
with self.subTest(constructor.__name__):
constructor(b'')
constructor(data=b'')
constructor(string=b'') # should be deprecated in the future
with self.assertWarnsRegex(DeprecationWarning,
DEPRECATED_STRING_PARAMETER):
constructor(string=b'')
digest_name = constructor(b'').name
with self.subTest(digest_name):
hashlib.new(digest_name, b'')
hashlib.new(digest_name, data=b'')
hashlib.new(digest_name, string=b'')
with self.assertWarnsRegex(DeprecationWarning,
DEPRECATED_STRING_PARAMETER):
hashlib.new(digest_name, string=b'')
if self._hashlib:
self._hashlib.new(digest_name, b'')
self._hashlib.new(digest_name, data=b'')
self._hashlib.new(digest_name, string=b'')
with self.assertWarnsRegex(DeprecationWarning,
DEPRECATED_STRING_PARAMETER):
self._hashlib.new(digest_name, string=b'')
@unittest.skipIf(get_fips_mode(), "skip in FIPS mode")
def test_clinic_signature_errors(self):

View File

@ -0,0 +1,7 @@
:mod:`hashlib`: Supporting the ``string`` keyword parameter in hash function
constructors such as :func:`~hashlib.new` or the direct hash-named constructors
such as :func:`~hashlib.md5` and :func:`~hashlib.sha256` is now deprecated and
slated for removal in Python 3.19.
Prefer passing the initial data as a positional argument for maximum backwards
compatibility.
Patch by Bénédikt Tran.

View File

@ -86,6 +86,15 @@ _Py_hashlib_data_argument(PyObject **res, PyObject *data, PyObject *string)
}
else if (data == NULL && string != NULL) {
// called as H(string=...)
if (PyErr_WarnEx(PyExc_DeprecationWarning,
"the 'string' keyword parameter is deprecated since "
"Python 3.15 and slated for removal in Python 3.19; "
"use the 'data' keyword parameter or pass the data "
"to hash as a positional argument instead", 1) < 0)
{
*res = NULL;
return -1;
}
*res = string;
return 1;
}