[Python-ideas] Python's Source of Randomness and the random.py module Redux
abarnert at yahoo.com
Thu Sep 10 12:33:08 CEST 2015
On Sep 10, 2015, at 01:32, Serhiy Storchaka <storchaka at gmail.com> wrote:
>> On 10.09.15 11:17, Andrew Barnert via Python-ideas wrote:
>>> On Sep 9, 2015, at 23:08, Chris Angelico <rosuav at gmail.com> wrote:
>>> On Thu, Sep 10, 2015 at 11:50 AM, Andrew Barnert via Python-ideas
>>> <python-ideas at python.org> wrote:
>>>> Of course it adds the cost of making the module slower, and also more complex. Maybe a better solution would be to add a random.set_default_instance function that replaced all of the top-level functions with bound methods of the instance (just like what's already done at startup in random.py)? That's simple, and doesn't slow down anything, and it seems like it makes it more clear what you're doing than setting random.inst.
>>> +1. A single function call that replaces all the methods adds a
>>> minuscule constant to code size, run time, etc, and it's no less
>>> readable than assignment to a module attribute. (If anything, it makes
>>> it more clearly a supported operation - I've seen novices not realize
>>> that "module.xyz = foo" is valid, but nobody would misunderstand the
>>> validity of a function call.)
>> I was only half-serious about this, but now I think I like it: it provides exactly the fix people are hoping to fix by deprecating the top-level functions, but with less risk, less user code churn, a smaller patch, and a much easier fix for novice users. (And it's much better than my earlier suggestion, too.)
>> See https://gist.github.com/abarnert/e0fced7569e7d77f7464 for the patch, and a patched copy of random.py. The source comments in the patch should be enough to understand everything that's changed.
> This doesn't work with the idiom "from random import random".
Well, the goal of the deprecation idea was to eventually get people to explicitly use instances, so the fact that doesn't work out of the box is a good thing, not a problem.
But for people just trying to retrofit existing code, all they have to do is call random.set_default_instance at the top of the main module, and all their other modules can just import what they need this way. Which is why it's better than straightforward deprecation.
More information about the Python-ideas