@staticmethod
def num_input(question, *choices):
    '\n        Take user input based on several different options.\n\n        The input question will be repeated until valid input is given.\n        The choices will be displayed in order with a number next to them indicating their id.\n        Responses can be given as the choice id or the full choice name.\n\n        Parameters\n        ----------\n        question : str\n            String to be displayed as the input question. Will be boxed with Utils#box_string before printing.\n        *choices : *str\n            Options for the user to choose from.\n\n        Returns\n        -------\n        int\n            Number of the answer choice, corresponding to the index of the choice in *choices.\n        '
    error = ''
    while True:
        Utils.box_string(((error + '\n') + question).strip(), print_string=True)
        for i in range(len(choices)):
            print(('%d: %s' % (i, choices[i])))
        response = input('Response: ')
        if fullmatch('\\d+', response.strip()):
            to_int = int(response.strip())
            if (to_int < len(choices)):
                return to_int
            else:
                error = 'ERROR: Invalid input! Input integer is not one of the available choices! Please try again.'
            continue
        else:
            for i in range(len(choices)):
                if (response.strip().lower() == choices[i].strip().lower()):
                    return i
            error = 'ERROR: Invalid input! Input string is not one of the available choices! Please try again.'
            continue
Take user input based on several different options.

The input question will be repeated until valid input is given.
The choices will be displayed in order with a number next to them indicating their id.
Responses can be given as the choice id or the full choice name.

Parameters
----------
question : str
    String to be displayed as the input question. Will be boxed with Utils#box_string before printing.
*choices : *str
    Options for the user to choose from.

Returns
-------
int
    Number of the answer choice, corresponding to the index of the choice in *choices.
@staticmethod
def num_input(question, *choices):
    '\n        Take user input based on several different options.\n\n        The input question will be repeated until valid input is given.\n        The choices will be displayed in order with a number next to them indicating their id.\n        Responses can be given as the choice id or the full choice name.\n\n        Parameters\n        ----------\n        question : str\n            String to be displayed as the input question. Will be boxed with Utils#box_string before printing.\n        *choices : *str\n            Options for the user to choose from.\n\n        Returns\n        -------\n        int\n            Number of the answer choice, corresponding to the index of the choice in *choices.\n        '
    error = 
    while True:
        Utils.box_string(((error + '\n') + question).strip(), print_string=True)
        for i in range(len(choices)):
            print(('%d: %s' % (i, choices[i])))
        response = input('Response: ')
        if fullmatch('\\d+', response.strip()):
            to_int = int(response.strip())
            if (to_int < len(choices)):
                return to_int
            else:
                error = 'ERROR: Invalid input! Input integer is not one of the available choices! Please try again.'
            continue
        else:
            for i in range(len(choices)):
                if (response.strip().lower() == choices[i].strip().lower()):
                    return i
            error = 'ERROR: Invalid input! Input string is not one of the available choices! Please try again.'
            continue