class_docstr: Extract Python Doc Strings, removing them from the AST and putting them in
  a dictionary for later use.
  
  >>> import gast as ast
  >>> from pythran import passmanager, backend
  >>> node = ast.parse("def foo(): 'my doc is cool' ; pass")
  >>> pm = passmanager.PassManager("test")
  >>> _ = pm.apply(ExtractDocStrings, node)
  >>> print(pm.dump(backend.Python, node))
  def foo():
      pass
class_docstr_tok: ["Extract","Python","Doc","Strings",",","removing","them","from","the","AST","and","putting","them","in","a","dictionary","for","later","use",".",">",">",">","import","gast","as","ast",">",">",">","from","pythran","import","passmanager",",","backend",">",">",">","node","=","ast.parse","(","``","def","foo","(",")",":","'my","doc","is","cool","'",";","pass","''",")",">",">",">","pm","=","passmanager.PassManager","(","``","test","''",")",">",">",">","_","=","pm.apply","(","ExtractDocStrings",",","node",")",">",">",">","print","(","pm.dump","(","backend.Python",",","node",")",")","def","foo","(",")",":","pass"]
code: def visit_documented_node(self, key, node):
      if node.body:
          first_stmt = node.body[0]
          if isinstance(first_stmt, ast.Expr):
              if isstr(first_stmt.value):
                  self.update = True
                  docstring = first_stmt.value.value
                  self.docstrings[key] = docstring
                  node.body.pop(0)
      return self.generic_visit(node)
  
file_path: pythran/pythran/transformations/extract_doc_strings.py
imports: from pythran.passmanager import Transformation
  from pythran.utils import isstr
  import gast
label_desc: Use image node_id 4 for calling the ExtractDocStrings obj's underlying member method code with example usage: obj.visit_documented_node(key, node) and returns: self