diff --git a/satella/random.py b/satella/random.py index ebafc1232707abade6520a8f4a56b3bb3385598f..ba42308d0b610e9e3acaa91aea2657a5e4f834c4 100644 --- a/satella/random.py +++ b/satella/random.py @@ -1,3 +1,4 @@ +import typing as tp import os import random import typing as tp @@ -8,22 +9,27 @@ __all__ = ['shuffle_together', 'random_binary', 'random_word'] from satella.coding.typing import T -def random_word(length: int, choice: T = string.ascii_lowercase, - join_fun: tp.Callable[[T, ...], T] = lambda *args: ''.join(args)): +def random_word(length: int, choice: tp.Sequence[T] = string.ascii_lowercase, + join_fun: tp.Callable[[tp.List[T]], T] = lambda args: ''.join(args)) -> \ + tp.Sequence[T]: """ Build and return a random word of provided length. The word will be built by calling join_fun with length of arguments picked at random from choice. + Best used with strings. Provide a word length, a string to choose from as choice (defaults + to string.ascii_lowercase). Will return by default a string (which coincidentally + happens to be a sequence of strings, albeit one-character ones). + :param length: length of the word :param choice: a range of characters to use. By default is string.ascii_lowercase - :param join_fun: an argument to be called with randomly picked characters as *args. + :param join_fun: an argument to be called with a list of randomly picked values. Defaults to ''.join(args), so your T must be a string. If you're passing a different type, remember to alter this function because the default one expects strings! :return: a random word """ - return join_fun(*(random.choice(choice) for _ in range(length))) + return join_fun([random.choice(choice) for _ in range(length)]) def random_binary(length: int) -> bytes: