From c1c43cad63a88eae694b174c9a0fe6242dd5972b Mon Sep 17 00:00:00 2001 From: Raymond Hettinger Date: Sun, 5 Sep 2004 00:00:42 +0000 Subject: Fulfill Martin's request to use try/except rather than a "look before you leap" approach. Makes the early call to os.urandom() unnecessary. --- Lib/random.py | 25 ++++++++----------------- Lib/test/test_random.py | 6 +++++- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/Lib/random.py b/Lib/random.py index e6f6e4b5d9..46a1b1f9f7 100644 --- a/Lib/random.py +++ b/Lib/random.py @@ -44,6 +44,8 @@ from types import MethodType as _MethodType, BuiltinMethodType as _BuiltinMethod from math import log as _log, exp as _exp, pi as _pi, e as _e from math import sqrt as _sqrt, acos as _acos, cos as _cos, sin as _sin from math import floor as _floor +from os import urandom as _urandom +from binascii import hexlify as _hexlify __all__ = ["Random","seed","random","uniform","randint","choice","sample", "randrange","shuffle","normalvariate","lognormvariate", @@ -59,13 +61,6 @@ SG_MAGICCONST = 1.0 + _log(4.5) BPF = 53 # Number of bits in a float RECIP_BPF = 2**-BPF -try: - from os import urandom as _urandom - from binascii import hexlify as _hexlify - _urandom(1) # verify that urandom is implemented -except (ImportError, NotImplementedError): - _urandom = None - # Translated by Guido van Rossum from C source provided by # Adrian Baddeley. Adapted by Raymond Hettinger for use with @@ -111,11 +106,11 @@ class Random(_random.Random): """ if a is None: - if _urandom is None: + try: + a = long(_hexlify(_urandom(16)), 16) + except NotImplementedError: import time a = long(time.time() * 256) # use fractional seconds - else: - a = long(_hexlify(_urandom(16)), 16) super(Random, self).seed(a) self.gauss_next = None @@ -620,11 +615,11 @@ class WichmannHill(Random): """ if a is None: - if _urandom is None: + try: + a = long(_hexlify(_urandom(16)), 16) + except NotImplementedError: import time a = long(time.time() * 256) # use fractional seconds - else: - a = long(_hexlify(_urandom(16)), 16) if not isinstance(a, (int, long)): a = hash(a) @@ -759,14 +754,10 @@ class HardwareRandom(Random): def random(self): """Get the next random number in the range [0.0, 1.0).""" - if _urandom is None: - raise NotImplementedError('Cannot find hardware entropy source') return (long(_hexlify(_urandom(7)), 16) >> 3) * RECIP_BPF def getrandbits(self, k): """getrandbits(k) -> x. Generates a long int with k random bits.""" - if _urandom is None: - raise NotImplementedError('Cannot find hardware entropy source') if k <= 0: raise ValueError('number of bits must be greater than zero') if k != int(k): diff --git a/Lib/test/test_random.py b/Lib/test/test_random.py index 139e8bf294..f30ed1fbd4 100644 --- a/Lib/test/test_random.py +++ b/Lib/test/test_random.py @@ -495,7 +495,11 @@ def test_main(verbose=None): TestDistributions, TestModule] - if random._urandom is not None: + try: + random.HardwareRandom().random() + except NotImplementedError: + pass + else: testclasses.append(HardwareRandom_TestBasicOps) test_support.run_unittest(*testclasses) -- cgit v1.2.1