<div dir="ltr">On Mon, Sep 14, 2015 at 8:32 AM, Nick Coghlan <<a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>> wrote:<br>><br>> This is an expansion of the random module enhancement idea I<br>> previously posted to Donald's thread:<br>> <a href="https://mail.python.org/pipermail/python-ideas/2015-September/035969.html" target="_blank">https://mail.python.org/pipermail/python-ideas/2015-September/035969.html</a><br>><br>> I'll write it up as a full PEP later, but I think it's just as useful<br>> in this form for now.<br>><br>> [snip]<div>><br>> * expose a global SystemRandom instance as random.system_random<br>> * provide a random.set_default_instance() API that makes it possible<br>> to specify the instance used by the module level methods<br>> * the module level seed(), getstate(), and setstate() functions will<br>> throw RuntimeError if the corresponding method is missing from the<br>> default instance<br><br></div><div>One problem that people (I can't remember who) have pointed out about</div><div>random.set_default_instance() is that any imported module in the same</div><div>process can change the random from secure -> insecure at a distance.</div><div>One way to solve this is to ensure that set_default_instance() can be</div><div>called only once; if it is called more than once, a RuntimeError could</div><div>be raised.  I think the logging module does something like this for</div><div>setting the logging level?</div><div><br></div><div>I think the only way that this really would make sense would be to make</div><div>set_default_instance() be called before any of the module level functions.</div><div>The first time a module level function is called, you could default to</div><div>selecting the CSRNG.  If you call one of the seeded API functions</div><div>(getstate, setstate, seed) before the other module-level functions the</div><div>instance could default to the deterministic RNG, but that might be</div><div>confusing to debug.  I could imagine people getting really confused</div><div>if this program worked:</div><div><br></div><div><div>    import random</div><div>    random.seed(1234)</div><div>    random.random()</div></div><div><br></div><div>but this program failed:</div><div><br></div><div><div>    import random</div><div>    random.random()<br></div><div>    random.seed(1234) # would raise a RuntimeError</div><div>    random.random() # would not be reached</div></div><div><br></div><div>I'm not crazy about the idea of changing the default instance based on the</div><div>first module level function called; that might be a terrible idea.  But I</div><div>_do_ think it's a good idea not to let the default instance change</div><div>throughout the life of the program.</div></div>