docs: def short_answer(question, answers, explanation=None):
      """
      Generates a short answer question that allows user to input an answer in
      a textbox and a submit button to check the answer.
  
      Args:
          question (str):  The question being asked.
  
          answers (str | list str | func): If a string, only that string will be
              marked correct. If a list of string, any string in the list will be
              marked correct. If a function, any input that causes the function
              to return True will be marked correct.
  
          explanation (str):  The explanation to the question is displayed when
              the user inputs the correct answer.
  
      Returns:
          None
  
      >>> short_answer('What is 1 + 1?', '2',
      ...              explanation='1+1 is 2') #doctest: +SKIP
      <What is 1+1?>
      <Input box, Submit button>
      >>> short_answer('Enter the first name of a member of the Beatles.',
      ...              ['John', 'Paul', 'George', 'Ringo']) #doctest: +SKIP
      <Enter the first name of a member of the Beatles.>
      <Input box, Submit button>
      >>> short_answer('Enter an even number.',
      ...              lambda x: int(x) % 2 == 0) #doctest: +SKIP
      <Enter an even number.>
      <Input box, Submit button>
      """
      # Input textbox
      textbox = widgets.Text(placeholder='Write your answer here')
      # Submit button
      submit_button = widgets.Button(description='Submit')
      # Space right of the submit button to show checkmark/x-mark
      visual_correct = widgets.HTML()
      # Space below input line to display error if function call errored
      error_space = widgets.HTML()
      # Space below input line to display explanation if answer is correct
      explain_space = widgets.HTML()
  
      # correctness function linked to the submit button
      def check_answer(_):
          response = textbox.value
          if isinstance(answers, collections.Callable):
              try:
                  error_space.value = ''
                  correct = answers(response)
              except Exception as e:
                  correct = False
                  error_space.value = 'Error in checking answer: {}'.format(e)
          elif isinstance(answers, str):
              correct = response == answers
          elif isinstance(answers, collections.Iterable):
              correct = response in answers
          else:
              raise TypeError('The `answers` arg is an incorrect type.')
  
          visual_correct.value = CHECK_ICON if correct else X_ICON
          if correct and explanation:
              explain_space.value = explanation
  
      submit_button.on_click(check_answer)
      question_tag = widgets.HTML(TEXT_STYLE.format(question))
      user_input_line = widgets.HBox([textbox, submit_button, visual_correct])
      display(
          widgets.VBox([
              question_tag, user_input_line, error_space, explain_space
          ])
      )