Source code for randword.rand_word
from random import choice, sample
from typing import Optional, List, Union
from .utilities import get_data
PARTS_OF_SPEECH = ['adj', 'adv', 'conj', 'interj', 'noun', 'prep', 'pron', 'verb']
[docs]def word(count: Optional[int] = None,
include_pos: Optional[List[str]] = None,
exclude_pos: Optional[List[str]] = None,
word_len: Optional[int] = None,
min_word_len: int = 1,
max_word_len: Optional[int] = None,
starts_with: Optional[str] = None,
ends_with: Optional[str] = None,
pattern: Optional[str] = None) -> Union[str, List[str]]:
'''
Returns a random English word or a list of words
Abbreviation "pos" means "part of speech"
Args:
count (int, optional): The number of words to
be generated. Defaults to None.
include_pos (list of str, optional): List of parts of speech that will be
included in the generation. Defaults to `None`
exclude_pos (list of str, optional): List of parts of speech that will be
excluded in the generation. Defaults to `None`
word_len (int, optional): Specifies the length of a word. Ignores the
`min_word_len` and `max_word_len` parameters. Defaults to `None`
min_word_len (int, optional): The minimum word length. Defaults to `1`
max_word_len (int, optional): The maximum word length. Defaults to `None`
starts_with (str, optional): The pattern with which
the word begins. Defaults to `None`
ends_with (str, optional): The pattern with which
the word ends. Defaults to `None`
pattern (str, optional): The pattern that should be
contained in the word. Defaults to `None`
Returns:
Union[str, List[str]]: A random English word if `count` is `None` or a list of them if `count` is not `None`
Raises:
IndexError: If the word was not found or if the
desired number of words was not found
'''
if not include_pos:
include_pos = PARTS_OF_SPEECH
if exclude_pos:
parts_of_speech = list(set(include_pos) - set(exclude_pos))
else:
parts_of_speech = include_pos
words = []
for part_of_speech in parts_of_speech:
pos_words = get_data('parts_of_speech', part_of_speech)
words.extend(pos_words)
if max_word_len:
filtered_words = list(filter(lambda word: min_word_len <= len(word) <= max_word_len, words))
else:
filtered_words = list(filter(lambda word: min_word_len <= len(word), words))
if word_len:
filtered_words = list(filter(lambda word: word_len == len(word), words))
if starts_with:
filtered_words = list(filter(lambda word: word.startswith(starts_with), filtered_words))
if ends_with:
filtered_words = list(filter(lambda word: word.endswith(ends_with), filtered_words))
if pattern:
filtered_words = list(filter(lambda word: pattern in word, filtered_words))
if count:
INDEX_ERROR_DESCRIPTION = 'The desired number of words was not found'
if not filtered_words:
raise IndexError(INDEX_ERROR_DESCRIPTION)
try:
final_words = sample(filtered_words, count)
except ValueError:
raise IndexError(INDEX_ERROR_DESCRIPTION)
return final_words
else:
if not filtered_words:
raise IndexError('The word was not found')
return choice(filtered_words)
if __name__ == '__main__':
print(word())