code: def hacking_docstring_summary(physical_line, previous_logical, tokens):
      r
      docstring = is_docstring(tokens, previous_logical)
      if docstring:
          if '\n' not in docstring:
              # not a multi line docstring
              return
          lines = docstring.split('\n')
          if len(lines) > 1 and len(lines[1].strip()) is not 0:
              # docstrings get tokenized on the last line of the docstring, so
              # we don't know the exact position.
              return (0, "H405: multi line docstring "
                      "summary not separated with an empty line")
docs: r"""Check multi line docstring summary is separated with empty line.
  
      OpenStack HACKING guide recommendation for docstring:
      Docstring should start with a one-line summary, less than 80 characters.
  
      Okay: def foo():\n    a = '''\nnot\na docstring\n'''
      Okay: '''foobar\n\nfoo\nbar\n'''
      H405: def foo():\n    '''foobar\nfoo\nbar\n'''
      H405: def foo():\n    r'''foobar\nfoo\nbar\n'''
      H405: def foo():\n    '''foobar\n'''