
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