code: def get_variable_docstrings(filename):
      
  
      def walk_node(parent, values=None, prefix=""):
          """
          walk the ast searching for docstrings/values
          """
          docstrings = {}
          if values is None:
              values = {}
          key = None
          for node in ast.iter_child_nodes(parent):
              if isinstance(node, ast.ClassDef):
                  # We are in a class so walk the class
                  docs = walk_node(node, values, prefix + node.name + ".")[0]
                  docstrings[node.name] = docs
              elif isinstance(node, ast.Assign):
                  key = node.targets[0].id
                  if isinstance(node.value, ast.Num):
                      values[key] = node.value.n
                  if isinstance(node.value, ast.Str):
                      values[key] = node.value.s
                  if isinstance(node.value, ast.Name):
                      if node.value.id in values:
                          values[prefix + key] = values[node.value.id]
              elif isinstance(node, ast.Expr) and key:
                  docstrings[key] = node.value.s
              else:
                  key = None
          return docstrings, values
  
      with open(filename, "r") as f:
          source = f.read()
      return walk_node(ast.parse(source))
docs: Go through the file and find all documented variables.
      That is ones that have a literal expression following them.
  
      Also get a dict of assigned values so that we can substitute constants.