nodes: 0, module; 1, function_definition; 2, function_name:options; 3, parameters; 4, block; 5, identifier:self; 6, expression_statement; 7, expression_statement; 8, expression_statement; 9, expression_statement; 10, for_statement; 11, comment:"""
          Returns an iterable of sorted option names in order to loop
          through all the configuration directives specified in the class.
          """; 12, assignment; 13, call; 14, assignment; 15, identifier:opt; 16, identifier:keys; 17, block; 18, identifier:keys; 19, call; 20, attribute; 21, argument_list; 22, identifier:keys; 23, call; 24, expression_statement; 25, if_statement; 26, attribute; 27, argument_list; 28, identifier:keys; 29, identifier:update; 30, attribute; 31, identifier:sorted; 32, argument_list; 33, assignment; 34, comparison_operator:val is not None; 35, block; 36, attribute; 37, identifier:copy; 38, identifier:self; 39, identifier:__dict__; 40, call; 41, identifier:val; 42, call; 43, identifier:val; 44, None; 45, expression_statement; 46, attribute; 47, identifier:__dict__; 48, attribute; 49, argument_list; 50, attribute; 51, argument_list; 52, yield; 53, identifier:self; 54, identifier:__class__; 55, identifier:keys; 56, identifier:keys; 57, identifier:self; 58, identifier:get; 59, identifier:opt; 60, expression_list; 61, identifier:opt; 62, identifier:val
code: def options(self):
          """
          Returns an iterable of sorted option names in order to loop
          through all the configuration directives specified in the class.
          """
          keys = self.__class__.__dict__.copy()
          keys.update(self.__dict__)
          keys = sorted(keys.keys())
  
          for opt in keys:
              val = self.get(opt)
              if val is not None:
                  yield opt, val