class_docstr: Information about a frame!
  Pass either a frame object or a traceback object,
  and optionally an Options object to configure.
  
  Or use the classmethod FrameInfo.stack_data() for an iterator of FrameInfo and
  RepeatedFrames objects. 
  
  Attributes:
      - frame: an actual stack frame object, either frame_or_tb or frame_or_tb.tb_frame
      - options
      - code: frame.f_code
      - source: a Source object
      - filename: a hopefully absolute file path derived from code.co_filename
      - scope: the AST node of the innermost function, class or module being executed
      - lines: a list of Line/LineGap objects to display, determined by options
      - executing: an Executing object from the `executing` library, which has:
          - .node: the AST node being executed in this frame, or None if it's unknown
          - .statements: a set of one or more candidate statements (AST nodes, probably just one)
              currently being executed in this frame.
          - .code_qualname(): the __qualname__ of the function or class being executed,
              or just the code name.
  
  Properties returning one or more pieces of source code (ranges of lines):
      - scope_pieces: all the pieces in the scope
      - included_pieces: a subset of scope_pieces determined by options
      - executing_piece: the piece currently being executed in this frame
  
  Properties returning lists of Variable objects:
      - variables: all variables in the scope
      - variables_by_lineno: variables organised into lines
      - variables_in_lines: variables contained within FrameInfo.lines
      - variables_in_executing_piece: variables contained within FrameInfo.executing_piece
class_docstr_tok: ["Information","about","a","frame","!","Pass","either","a","frame","object","or","a","traceback","object",",","and","optionally","an","Options","object","to","configure",".","Or","use","the","classmethod","FrameInfo.stack_data","(",")","for","an","iterator","of","FrameInfo","and","RepeatedFrames","objects",".","Attributes",":","-","frame",":","an","actual","stack","frame","object",",","either","frame_or_tb","or","frame_or_tb.tb_frame","-","options","-","code",":","frame.f_code","-","source",":","a","Source","object","-","filename",":","a","hopefully","absolute","file","path","derived","from","code.co_filename","-","scope",":","the","AST","node","of","the","innermost","function",",","class","or","module","being","executed","-","lines",":","a","list","of","Line\/LineGap","objects","to","display",",","determined","by","options","-","executing",":","an","Executing","object","from","the","`","executing","`","library",",","which","has",":","-",".node",":","the","AST","node","being","executed","in","this","frame",",","or","None","if","it","'s","unknown","-",".statements",":","a","set","of","one","or","more","candidate","statements","(","AST","nodes",",","probably","just","one",")","currently","being","executed","in","this","frame",".","-",".code_qualname","(",")",":","the","__qualname__","of","the","function","or","class","being","executed",",","or","just","the","code","name",".","Properties","returning","one","or","more","pieces","of","source","code","(","ranges","of","lines",")",":","-","scope_pieces",":","all","the","pieces","in","the","scope","-","included_pieces",":","a","subset","of","scope_pieces","determined","by","options","-","executing_piece",":","the","piece","currently","being","executed","in","this","frame","Properties","returning","lists","of","Variable","objects",":","-","variables",":","all","variables","in","the","scope","-","variables_by_lineno",":","variables","organised","into","lines","-","variables_in_lines",":","variables","contained","within","FrameInfo.lines","-","variables_in_executing_piece",":","variables","contained","within","FrameInfo.executing_piece"]
docstr: A mapping from 1-based line numbers to lists of pairs:
      - A Variable object
      - A specific AST node from the variable's .nodes list that's
          in the line at that line number.
docstr_tok: ["A","mapping","from","1-based","line","numbers","to","lists","of","pairs",":","-","A","Variable","object","-","A","specific","AST","node","from","the","variable","'s",".nodes","list","that's","in","the","line","at","that","line","number","."]
code: def variables_by_lineno(
      self,
  ) -> Mapping[int, List[Tuple[Variable, ast.AST]]]:
      """
      A mapping from 1-based line numbers to lists of pairs:
          - A Variable object
          - A specific AST node from the variable's .nodes list that's
              in the line at that line number.
      """
      result = defaultdict(list)
      for var in self.variables:
          for node in var.nodes:
              for lineno in range(*self.source.line_range(node)):
                  result[lineno].append((var, node))
      return result
  
imports: import ast
  import html
  import os
  import sys
  from collections import defaultdict, Counter
  from enum import Enum
  from textwrap import dedent
  from types import FrameType, CodeType, TracebackType
  from typing import Iterator, List, Tuple, Optional, NamedTuple, Any, Iterable, Callable, Union, Sequence
  from typing import Mapping
  import executing
  from asttokens.util import Token
  from executing import only
  from pure_eval import Evaluator, is_expression_interesting
  from stack_data.utils import truncate, unique_in_order, line_range, frame_and_lineno, iter_stack, collapse_repeated, group_by_key_func, cached_property, is_frame, _pygmented_with_ranges, assert_
label_desc: Use image node_id 13 for calling the FrameInfo obj's underlying member method code with example usage: obj.variables_by_lineno() and returns: result