Source code for mimesis.providers.choice
"""Provides a random choice from items in a sequence."""
import typing as t
from mimesis.providers.base import BaseProvider
__all__ = ["Choice"]
[docs]
class Choice(BaseProvider):
"""Class for generating a random choice from items in a sequence."""
class Meta:
name = "choice"
[docs]
def choice(self, *args: t.Any, **kwargs: t.Any) -> t.Any:
"""Choice random item form sequence.
See https://github.com/lk-geimfari/mimesis/issues/619
:param args: Positional arguments.
:param kwargs: Keyword arguments.
:return: Sequence or uncontained element randomly chosen from items.
"""
return self.__call__(*args, **kwargs)
def __call__(
self,
items: t.Sequence[t.Any] | None,
length: int = 0,
unique: bool = False,
) -> t.Sequence[t.Any] | t.Any:
"""Generates a randomly chosen sequence or bare element from a sequence.
Provide elements randomly chosen from the elements in a sequence
**items**, where when **length** is specified the random choices are
contained in a sequence of the same type of length **length**,
otherwise a single uncontained element is chosen. If **unique** is set
to True, constrain a returned sequence to contain only unique elements.
:param items: Non-empty sequence (list, tuple or string) of elements.
:param length: Length of the sequence (number of elements) to provide.
:param unique: If True, ensures provided elements are unique.
:return: Sequence or uncontained element randomly chosen from items.
:raises TypeError: For non-sequence items or non-integer length.
:raises ValueError: If negative length or insufficient unique elements.
>>> from mimesis import Choice
>>> choice = Choice()
>>> choice(items=['a', 'b', 'c'])
'c'
>>> choice(items=['a', 'b', 'c'], length=1)
['a']
>>> choice(items='abc', length=2)
'ba'
>>> choice(items=('a', 'b', 'c'), length=5)
('c', 'a', 'a', 'b', 'c')
>>> choice(items='aabbbccccddddd', length=4, unique=True)
'cdba'
"""
if not isinstance(items, t.Sequence):
raise TypeError("**items** must be non-empty sequence.")
if not items:
raise ValueError("**items** must be a non-empty sequence.")
if length < 0:
raise ValueError("**length** should be a positive integer.")
if length == 0:
return self.random.choice(items)
if unique and len(set(items)) < length:
raise ValueError(
"There are not enough unique elements in "
"**items** to provide the specified **number**."
)
if unique:
data: list[str] = self.random.sample(list(set(items)), k=length)
else:
data = self.random.choices(items, k=length)
if isinstance(items, list):
return data
elif isinstance(items, tuple):
return tuple(data)
return "".join(data)