import datetime from typing import List, Optional, TypeVar ChoiceType = TypeVar("ChoiceType") def select_from_list(choices: List[ChoiceType], choice_name: str, none_is_option: bool = False) -> ChoiceType: query_user = True return_value: ChoiceType = None while query_user: print(f'Choose the {choice_name} from this list:') number_of_choices = len(choices) for i in range(number_of_choices): print(f'{i+1})\t{choices[i]}'.expandtabs(4)) if none_is_option: print('0)\tNone of the above'.expandtabs(4)) selection = input('Enter selection: ') try: selection_value = int(selection) if none_is_option and selection_value == 0: return_value = None query_user = False elif selection_value < 1 or selection_value > number_of_choices: raise ValueError('Selection out of range.') else: return_value = choices[selection_value - 1] query_user = False except ValueError: print(f'\tSelection must be an integer between {0 if none_is_option else 1} ' f'and {number_of_choices}, inclusive!') return return_value def strip_html(text: Optional[str]) -> Optional[str]: import re if text is not None: return re.sub(re.compile('<.*?>'), '', text) else: return None def semester_stamp() -> str: today = datetime.date.today() year: int = today.year month: int = today.month # Normalize month to semester start if month < 5: month = 1 elif month < 8: month = 5 else: month = 8 return f'{year}-0{month}'