[Python-checkins] bpo-32554: Deprecate hashing arbitrary types in random.seed() (GH-15382)
Raymond Hettinger
webhook-mailer at python.org
Thu Aug 22 12:19:40 EDT 2019
https://github.com/python/cpython/commit/d0cdeaab76fef8a6e5a04665df226b6659111e4e
commit: d0cdeaab76fef8a6e5a04665df226b6659111e4e
branch: master
author: Raymond Hettinger <rhettinger at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2019-08-22T09:19:36-07:00
summary:
bpo-32554: Deprecate hashing arbitrary types in random.seed() (GH-15382)
files:
A Misc/NEWS.d/next/Library/2019-08-22-01-49-05.bpo-32554.4xiXyM.rst
M Doc/library/random.rst
M Doc/whatsnew/3.9.rst
M Lib/random.py
diff --git a/Doc/library/random.rst b/Doc/library/random.rst
index 90b86248e6e1..1bd1856937be 100644
--- a/Doc/library/random.rst
+++ b/Doc/library/random.rst
@@ -86,6 +86,11 @@ Bookkeeping functions
.. versionchanged:: 3.2
Moved to the version 2 scheme which uses all of the bits in a string seed.
+ .. deprecated:: 3.9
+ In the future, the *seed* must be one of the following types:
+ *NoneType*, :class:`int`, :class:`float`, :class:`str`,
+ :class:`bytes`, or :class:`bytearray`.
+
.. function:: getstate()
Return an object capturing the current internal state of the generator. This
@@ -316,6 +321,11 @@ Alternative Generator
Class that implements the default pseudo-random number generator used by the
:mod:`random` module.
+ .. deprecated:: 3.9
+ In the future, the *seed* must be one of the following types:
+ :class:`NoneType`, :class:`int`, :class:`float`, :class:`str`,
+ :class:`bytes`, or :class:`bytearray`.
+
.. class:: SystemRandom([seed])
Class that uses the :func:`os.urandom` function for generating random numbers
diff --git a/Doc/whatsnew/3.9.rst b/Doc/whatsnew/3.9.rst
index 6615a2e28eff..05a17a5c7390 100644
--- a/Doc/whatsnew/3.9.rst
+++ b/Doc/whatsnew/3.9.rst
@@ -169,6 +169,12 @@ Deprecated
of Python. For the majority of use cases users can leverage the Abstract Syntax
Tree (AST) generation and compilation stage, using the :mod:`ast` module.
+* The :mod:`random` module currently accepts any hashable type as a
+ possible seed value. Unfortunately, some of those types are not
+ guaranteed to have a deterministic hash value. After Python 3.9,
+ the module will restrict its seeds to *None*, :class:`int`,
+ :class:`float`, :class:`str`, :class:`bytes`, and :class:`bytearray`.
+
Removed
=======
diff --git a/Lib/random.py b/Lib/random.py
index 365a01957203..be4401c554d7 100644
--- a/Lib/random.py
+++ b/Lib/random.py
@@ -121,7 +121,10 @@ def __init_subclass__(cls, /, **kwargs):
break
def seed(self, a=None, version=2):
- """Initialize internal state from hashable object.
+ """Initialize internal state from a seed.
+
+ The only supported seed types are None, int, float,
+ str, bytes, and bytearray.
None or no argument seeds from current time or from an operating
system specific randomness source if available.
@@ -143,12 +146,20 @@ def seed(self, a=None, version=2):
x ^= len(a)
a = -2 if x == -1 else x
- if version == 2 and isinstance(a, (str, bytes, bytearray)):
+ elif version == 2 and isinstance(a, (str, bytes, bytearray)):
if isinstance(a, str):
a = a.encode()
a += _sha512(a).digest()
a = int.from_bytes(a, 'big')
+ elif not isinstance(a, (type(None), int, float, str, bytes, bytearray)):
+ _warn('Seeding based on hashing is deprecated\n'
+ 'since Python 3.9 and will be removed in a subsequent '
+ 'version. The only \n'
+ 'supported seed types are: None, '
+ 'int, float, str, bytes, and bytearray.',
+ DeprecationWarning, 2)
+
super().seed(a)
self.gauss_next = None
diff --git a/Misc/NEWS.d/next/Library/2019-08-22-01-49-05.bpo-32554.4xiXyM.rst b/Misc/NEWS.d/next/Library/2019-08-22-01-49-05.bpo-32554.4xiXyM.rst
new file mode 100644
index 000000000000..752cf48a4543
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2019-08-22-01-49-05.bpo-32554.4xiXyM.rst
@@ -0,0 +1 @@
+Deprecate having random.seed() call hash on arbitrary types.
More information about the Python-checkins
mailing list