[Python-ideas] Pre-PEP Adding A Secrets Module To The Standard Library

Steven D'Aprano steve at pearwood.info
Tue Sep 22 05:23:02 CEST 2015


On Mon, Sep 21, 2015 at 05:32:44PM -0400, Terry Reedy wrote:
> On 9/21/2015 12:22 PM, Steven D'Aprano wrote:
> >On Sun, Sep 20, 2015 at 09:00:08AM +0300, Serhiy Storchaka wrote:
> 
> >>randbelow() is just an alias for randrange() with single argument.
> >>randint(a, b) == randrange(a, b+1).
> >>
> >>These functions are redundant and they have non-zero cost.
> >
> >But they already exist in the random module, so adding them to secrets
> >doesn't cost anything extra.
> 
> I think the redundancy in random is a mistake.  The cost is confusion 
> and extra memory load, and there need to more ofter refer to the manual, 
> for essentially zero gain. 

Sorry, I don't understand what you mean.

Do you mean that it is a mistake for the random module to have randint 
and randrange? Or that it is a mistake for the secrets module to include 
functions that the random module includes?


> When I read two names, I expect them to do 
> two different things.  The question is whether to propagate the mistake 
> to a new module.

If you are referring to randint versus randrange, they do do different 
things. Look at their signatures.

randint(a, b) follows the ubiquitous API of "generate a random integer 
from the closed range a through b inclusive". 

randrange([start,] end [, step]) follows the Python practice of 
specifying a half-open interval, and has a more complex signature.

Even though randrange is more Pythonic, I've never actually used it. 
randint is always what I've wanted. E.g.

def die():
    # Roll a die.
    return randint(1, 6)

is far more natural than randrange(1, 7), Pythonic half-open intervals 
or not.

But I'm satisfied that others may think differently, and by Tim's 
argument that excluding one or the other will be more confusing than 
including them both.


-- 
Steve


More information about the Python-ideas mailing list