Skip to content

Commit 18d0222

Browse files
committed
Fix: DeprecationWarning: Seeding based on hashing is deprecated since Python 3.9 and will be removed in a subsequent version.
1 parent e829532 commit 18d0222

File tree

1 file changed

+26
-7
lines changed

1 file changed

+26
-7
lines changed

petl/util/random.py

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,24 @@
11
from __future__ import absolute_import, print_function, division
22

3-
4-
import datetime
3+
import hashlib
54
import random
65
import time
76
from collections import OrderedDict
87
from functools import partial
8+
99
from petl.compat import xrange, text_type
10+
from petl.util.base import Table
1011

1112

12-
from petl.util.base import Table
13+
def randomseed():
14+
"""
15+
Obtain the hex digest of a sha256 hash of the
16+
current epoch time in nanoseconds.
17+
"""
18+
19+
time_ns = str(time.time()).encode()
20+
hash_time = hashlib.sha256(time_ns).hexdigest()
21+
return hash_time
1322

1423

1524
def randomtable(numflds=5, numrows=100, wait=0, seed=None):
@@ -36,9 +45,11 @@ def randomtable(numflds=5, numrows=100, wait=0, seed=None):
3645
| 0.026535969683863625 | 0.1988376506866485 | 0.6498844377795232 |
3746
+----------------------+----------------------+---------------------+
3847
...
48+
<BLANKLINE>
3949
4050
Note that the data are generated on the fly and are not stored in memory,
4151
so this function can be used to simulate very large tables.
52+
The only supported seed types are: None, int, float, str, bytes, and bytearray.
4253
4354
"""
4455

@@ -52,7 +63,7 @@ def __init__(self, numflds=5, numrows=100, wait=0, seed=None):
5263
self.numrows = numrows
5364
self.wait = wait
5465
if seed is None:
55-
self.seed = datetime.datetime.now()
66+
self.seed = randomseed()
5667
else:
5768
self.seed = seed
5869

@@ -77,7 +88,7 @@ def __iter__(self):
7788
yield tuple(random.random() for n in range(nf))
7889

7990
def reseed(self):
80-
self.seed = datetime.datetime.now()
91+
self.seed = randomseed()
8192

8293

8394
def dummytable(numrows=100,
@@ -108,6 +119,7 @@ def dummytable(numrows=100,
108119
| 4 | 'apples' | 0.09369523986159245 |
109120
+-----+----------+----------------------+
110121
...
122+
<BLANKLINE>
111123
112124
>>> # customise fields
113125
... import random
@@ -132,12 +144,19 @@ def dummytable(numrows=100,
132144
| 0.4219218196852704 | 15 | 'chocolate' |
133145
+---------------------+-----+-------------+
134146
...
147+
<BLANKLINE>
148+
149+
>>> table3_1 = etl.dummytable(50)
150+
>>> table3_2 = etl.dummytable(100)
151+
>>> table3_1[5] == table3_2[5]
152+
False
135153
136154
Data generation functions can be specified via the `fields` keyword
137155
argument.
138156
139157
Note that the data are generated on the fly and are not stored in memory,
140158
so this function can be used to simulate very large tables.
159+
The only supported seed types are: None, int, float, str, bytes, and bytearray.
141160
142161
"""
143162

@@ -154,7 +173,7 @@ def __init__(self, numrows=100, fields=None, wait=0, seed=None):
154173
else:
155174
self.fields = OrderedDict(fields)
156175
if seed is None:
157-
self.seed = datetime.datetime.now()
176+
self.seed = randomseed()
158177
else:
159178
self.seed = seed
160179

@@ -181,4 +200,4 @@ def __iter__(self):
181200
yield tuple(fields[f]() for f in fields)
182201

183202
def reseed(self):
184-
self.seed = datetime.datetime.now()
203+
self.seed = randomseed()

0 commit comments

Comments
 (0)