docs: def _var_docstrings(tree, module, cls=None, init=False):
      """
      Extracts variable docstrings given `tree` as the abstract syntax,
      `module` as a `pydoc.Module` containing `tree` and an option `cls`
      as a `pydoc.Class` corresponding to the tree. In particular, `cls`
      should be specified when extracting docstrings from a class or an
      `__init__` method. Finally, `init` should be `True` when searching
      the AST of an `__init__` method so that `_var_docstrings` will only
      accept variables starting with `self.` as instance variables.
  
      A dictionary mapping variable name to a `pydoc.Variable` object is
      returned.
      """
      vs = {}
      children = list(ast.iter_child_nodes(tree))
      for i, child in enumerate(children):
          if isinstance(child, ast.Assign) and len(child.targets) == 1:
              if not init and isinstance(child.targets[0], ast.Name):
                  name = child.targets[0].id
              elif (isinstance(child.targets[0], ast.Attribute)
                      and isinstance(child.targets[0].value, ast.Name)
                      and child.targets[0].value.id == 'self'):
                  name = child.targets[0].attr
              else:
                  continue
              if not _is_exported(name) \
                      and name not in getattr(module, '__all__', []):
                  continue
  
              docstring = ''
              if (i+1 < len(children)
                      and isinstance(children[i+1], ast.Expr)
                      and isinstance(children[i+1].value, ast.Str)):
                  docstring = children[i+1].value.s
  
              vs[name] = Variable(name, module, docstring, cls=cls)
      return vs