mirror of
https://github.com/evennia/evennia.git
synced 2026-03-18 13:56:30 +01:00
1769 lines
No EOL
254 KiB
HTML
1769 lines
No EOL
254 KiB
HTML
<!DOCTYPE html>
|
|
|
|
<html lang="en" data-content_root="../">
|
|
<head>
|
|
<meta charset="utf-8" />
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
<title>traceback — Evennia latest documentation</title>
|
|
<link rel="stylesheet" type="text/css" href="../_static/pygments.css?v=d75fae25" />
|
|
<link rel="stylesheet" type="text/css" href="../_static/nature.css?v=279e0f84" />
|
|
<link rel="stylesheet" type="text/css" href="../_static/custom.css?v=e4a91a55" />
|
|
<script src="../_static/documentation_options.js?v=c6e86fd7"></script>
|
|
<script src="../_static/doctools.js?v=9bcbadda"></script>
|
|
<script src="../_static/sphinx_highlight.js?v=dc90522c"></script>
|
|
<link rel="icon" href="../_static/favicon.ico"/>
|
|
<link rel="index" title="Index" href="../genindex.html" />
|
|
<link rel="search" title="Search" href="../search.html" />
|
|
</head><body>
|
|
<div class="related" role="navigation" aria-label="Related">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../genindex.html" title="General Index"
|
|
accesskey="I">index</a></li>
|
|
<li class="right" >
|
|
<a href="../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../index.html">Evennia</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="index.html" accesskey="U">Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">traceback</a></li>
|
|
</ul>
|
|
</div>
|
|
|
|
<div class="document">
|
|
<div class="documentwrapper">
|
|
<div class="bodywrapper">
|
|
<div class="body" role="main">
|
|
|
|
<h1>Source code for traceback</h1><div class="highlight"><pre>
|
|
<span></span><span class="sd">"""Extract, format and print information about Python stack traces."""</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">collections.abc</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">itertools</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">linecache</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">sys</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">textwrap</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">warnings</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">contextlib</span><span class="w"> </span><span class="kn">import</span> <span class="n">suppress</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">_colorize</span>
|
|
<span class="kn">from</span><span class="w"> </span><span class="nn">_colorize</span><span class="w"> </span><span class="kn">import</span> <span class="n">ANSIColors</span>
|
|
|
|
<span class="n">__all__</span> <span class="o">=</span> <span class="p">[</span><span class="s1">'extract_stack'</span><span class="p">,</span> <span class="s1">'extract_tb'</span><span class="p">,</span> <span class="s1">'format_exception'</span><span class="p">,</span>
|
|
<span class="s1">'format_exception_only'</span><span class="p">,</span> <span class="s1">'format_list'</span><span class="p">,</span> <span class="s1">'format_stack'</span><span class="p">,</span>
|
|
<span class="s1">'format_tb'</span><span class="p">,</span> <span class="s1">'print_exc'</span><span class="p">,</span> <span class="s1">'format_exc'</span><span class="p">,</span> <span class="s1">'print_exception'</span><span class="p">,</span>
|
|
<span class="s1">'print_last'</span><span class="p">,</span> <span class="s1">'print_stack'</span><span class="p">,</span> <span class="s1">'print_tb'</span><span class="p">,</span> <span class="s1">'clear_frames'</span><span class="p">,</span>
|
|
<span class="s1">'FrameSummary'</span><span class="p">,</span> <span class="s1">'StackSummary'</span><span class="p">,</span> <span class="s1">'TracebackException'</span><span class="p">,</span>
|
|
<span class="s1">'walk_stack'</span><span class="p">,</span> <span class="s1">'walk_tb'</span><span class="p">]</span>
|
|
|
|
<span class="c1">#</span>
|
|
<span class="c1"># Formatting and printing lists of traceback lines.</span>
|
|
<span class="c1">#</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print_list</span><span class="p">(</span><span class="n">extracted_list</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Print the list of tuples as returned by extract_tb() or</span>
|
|
<span class="sd"> extract_stack() as a formatted stack trace to the given file."""</span>
|
|
<span class="k">if</span> <span class="n">file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">file</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span>
|
|
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">StackSummary</span><span class="o">.</span><span class="n">from_list</span><span class="p">(</span><span class="n">extracted_list</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">():</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">item</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_list</span><span class="p">(</span><span class="n">extracted_list</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format a list of tuples or FrameSummary objects for printing.</span>
|
|
|
|
<span class="sd"> Given a list of tuples or FrameSummary objects as returned by</span>
|
|
<span class="sd"> extract_tb() or extract_stack(), return a list of strings ready</span>
|
|
<span class="sd"> for printing.</span>
|
|
|
|
<span class="sd"> Each string in the resulting list corresponds to the item with the</span>
|
|
<span class="sd"> same index in the argument list. Each string ends in a newline;</span>
|
|
<span class="sd"> the strings may contain internal newlines as well, for those items</span>
|
|
<span class="sd"> whose source text line is not None.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">StackSummary</span><span class="o">.</span><span class="n">from_list</span><span class="p">(</span><span class="n">extracted_list</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">()</span>
|
|
|
|
<span class="c1">#</span>
|
|
<span class="c1"># Printing and Extracting Tracebacks.</span>
|
|
<span class="c1">#</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Print up to 'limit' stack trace entries from the traceback 'tb'.</span>
|
|
|
|
<span class="sd"> If 'limit' is omitted or None, all entries are printed. If 'file'</span>
|
|
<span class="sd"> is omitted or None, the output goes to sys.stderr; otherwise</span>
|
|
<span class="sd"> 'file' should be an open file or file-like object with a write()</span>
|
|
<span class="sd"> method.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">print_list</span><span class="p">(</span><span class="n">extract_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A shorthand for 'format_list(extract_tb(tb, limit))'."""</span>
|
|
<span class="k">return</span> <span class="n">extract_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">)</span><span class="o">.</span><span class="n">format</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">extract_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Return a StackSummary object representing a list of</span>
|
|
<span class="sd"> pre-processed entries from traceback.</span>
|
|
|
|
<span class="sd"> This is useful for alternate formatting of stack traces. If</span>
|
|
<span class="sd"> 'limit' is omitted or None, all entries are extracted. A</span>
|
|
<span class="sd"> pre-processed stack trace entry is a FrameSummary object</span>
|
|
<span class="sd"> containing attributes filename, lineno, name, and line</span>
|
|
<span class="sd"> representing the information that is usually printed for a stack</span>
|
|
<span class="sd"> trace. The line is a string with leading and trailing</span>
|
|
<span class="sd"> whitespace stripped; if the source is not available it is None.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">return</span> <span class="n">StackSummary</span><span class="o">.</span><span class="n">_extract_from_extended_frame_gen</span><span class="p">(</span>
|
|
<span class="n">_walk_tb_with_full_positions</span><span class="p">(</span><span class="n">tb</span><span class="p">),</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">)</span>
|
|
|
|
<span class="c1">#</span>
|
|
<span class="c1"># Exception formatting and output.</span>
|
|
<span class="c1">#</span>
|
|
|
|
<span class="n">_cause_message</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s2">"</span><span class="se">\n</span><span class="s2">The above exception was the direct cause "</span>
|
|
<span class="s2">"of the following exception:</span><span class="se">\n\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="n">_context_message</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="s2">"</span><span class="se">\n</span><span class="s2">During handling of the above exception, "</span>
|
|
<span class="s2">"another exception occurred:</span><span class="se">\n\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_Sentinel</span><span class="p">:</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"<implicit>"</span>
|
|
|
|
<span class="n">_sentinel</span> <span class="o">=</span> <span class="n">_Sentinel</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_parse_value_tb</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">value</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">)</span> <span class="o">!=</span> <span class="p">(</span><span class="n">tb</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"Both or neither of value and tb must be given"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="n">tb</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">exc</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="ne">BaseException</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="n">exc</span><span class="p">,</span> <span class="n">exc</span><span class="o">.</span><span class="n">__traceback__</span>
|
|
|
|
<span class="k">raise</span> <span class="ne">TypeError</span><span class="p">(</span><span class="sa">f</span><span class="s1">'Exception expected for value, '</span>
|
|
<span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="nb">type</span><span class="p">(</span><span class="n">exc</span><span class="p">)</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1"> found'</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span>
|
|
<span class="k">return</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print_exception</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">,</span> <span class="n">tb</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> \
|
|
<span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Print exception up to 'limit' stack trace entries from 'tb' to 'file'.</span>
|
|
|
|
<span class="sd"> This differs from print_tb() in the following ways: (1) if</span>
|
|
<span class="sd"> traceback is not None, it prints a header "Traceback (most recent</span>
|
|
<span class="sd"> call last):"; (2) it prints the exception type and value after the</span>
|
|
<span class="sd"> stack trace; (3) if type is SyntaxError and value has the</span>
|
|
<span class="sd"> appropriate format, it prints the line where the syntax error</span>
|
|
<span class="sd"> occurred with a caret on the next line indicating the approximate</span>
|
|
<span class="sd"> position of the error.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">_parse_value_tb</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
|
|
<span class="n">te</span> <span class="o">=</span> <span class="n">TracebackException</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">compact</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="n">te</span><span class="o">.</span><span class="n">print</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
|
|
|
|
<span class="n">BUILTIN_EXCEPTION_LIMIT</span> <span class="o">=</span> <span class="nb">object</span><span class="p">()</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_print_exception_bltin</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="o">/</span><span class="p">):</span>
|
|
<span class="n">file</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="k">if</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">sys</span><span class="o">.</span><span class="n">__stderr__</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">_colorize</span><span class="o">.</span><span class="n">can_colorize</span><span class="p">(</span><span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">print_exception</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">BUILTIN_EXCEPTION_LIMIT</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_exception</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">,</span> <span class="n">tb</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> \
|
|
<span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format a stack trace and the exception information.</span>
|
|
|
|
<span class="sd"> The arguments have the same meaning as the corresponding arguments</span>
|
|
<span class="sd"> to print_exception(). The return value is a list of strings, each</span>
|
|
<span class="sd"> ending in a newline and some containing internal newlines. When</span>
|
|
<span class="sd"> these lines are concatenated and printed, exactly the same text is</span>
|
|
<span class="sd"> printed as does print_exception().</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">value</span><span class="p">,</span> <span class="n">tb</span> <span class="o">=</span> <span class="n">_parse_value_tb</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">)</span>
|
|
<span class="n">te</span> <span class="o">=</span> <span class="n">TracebackException</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">value</span><span class="p">,</span> <span class="n">tb</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">compact</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">te</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_exception_only</span><span class="p">(</span><span class="n">exc</span><span class="p">,</span> <span class="o">/</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">_sentinel</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">show_group</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format the exception part of a traceback.</span>
|
|
|
|
<span class="sd"> The return value is a list of strings, each ending in a newline.</span>
|
|
|
|
<span class="sd"> The list contains the exception's message, which is</span>
|
|
<span class="sd"> normally a single string; however, for :exc:`SyntaxError` exceptions, it</span>
|
|
<span class="sd"> contains several lines that (when printed) display detailed information</span>
|
|
<span class="sd"> about where the syntax error occurred. Following the message, the list</span>
|
|
<span class="sd"> contains the exception's ``__notes__``.</span>
|
|
|
|
<span class="sd"> When *show_group* is ``True``, and the exception is an instance of</span>
|
|
<span class="sd"> :exc:`BaseExceptionGroup`, the nested exceptions are included as</span>
|
|
<span class="sd"> well, recursively, with indentation relative to their nesting depth.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="n">_sentinel</span><span class="p">:</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">exc</span>
|
|
<span class="n">te</span> <span class="o">=</span> <span class="n">TracebackException</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="n">value</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="n">compact</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">list</span><span class="p">(</span><span class="n">te</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">show_group</span><span class="o">=</span><span class="n">show_group</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">))</span>
|
|
|
|
|
|
<span class="c1"># -- not official API but folk probably use these two functions.</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_format_final_exc_line</span><span class="p">(</span><span class="n">etype</span><span class="p">,</span> <span class="n">value</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">insert_final_newline</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="n">valuestr</span> <span class="o">=</span> <span class="n">_safe_string</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="s1">'exception'</span><span class="p">)</span>
|
|
<span class="n">end_char</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span> <span class="k">if</span> <span class="n">insert_final_newline</span> <span class="k">else</span> <span class="s2">""</span>
|
|
<span class="k">if</span> <span class="n">colorize</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">valuestr</span><span class="p">:</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_MAGENTA</span><span class="si">}{</span><span class="n">etype</span><span class="si">}{</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="si">}{</span><span class="n">end_char</span><span class="si">}</span><span class="s2">"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_MAGENTA</span><span class="si">}{</span><span class="n">etype</span><span class="si">}{</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="si">}{</span><span class="n">valuestr</span><span class="si">}{</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="si">}{</span><span class="n">end_char</span><span class="si">}</span><span class="s2">"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">valuestr</span><span class="p">:</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">etype</span><span class="si">}{</span><span class="n">end_char</span><span class="si">}</span><span class="s2">"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="sa">f</span><span class="s2">"</span><span class="si">{</span><span class="n">etype</span><span class="si">}</span><span class="s2">: </span><span class="si">{</span><span class="n">valuestr</span><span class="si">}{</span><span class="n">end_char</span><span class="si">}</span><span class="s2">"</span>
|
|
<span class="k">return</span> <span class="n">line</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_safe_string</span><span class="p">(</span><span class="n">value</span><span class="p">,</span> <span class="n">what</span><span class="p">,</span> <span class="n">func</span><span class="o">=</span><span class="nb">str</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">func</span><span class="p">(</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="k">except</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s1">'<</span><span class="si">{</span><span class="n">what</span><span class="si">}</span><span class="s1"> </span><span class="si">{</span><span class="n">func</span><span class="o">.</span><span class="vm">__name__</span><span class="si">}</span><span class="s1">() failed>'</span>
|
|
|
|
<span class="c1"># --</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print_exc</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Shorthand for 'print_exception(sys.exception(), limit=limit, file=file, chain=chain)'."""</span>
|
|
<span class="n">print_exception</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exception</span><span class="p">(),</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">)</span>
|
|
|
|
<div class="viewcode-block" id="format_exc">
|
|
<a class="viewcode-back" href="../api/evennia.commands.cmdsethandler.html#evennia.commands.cmdhandler.format_exc">[docs]</a>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_exc</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Like print_exc() but return a string."""</span>
|
|
<span class="k">return</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">format_exception</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">exception</span><span class="p">(),</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">))</span></div>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print_last</span><span class="p">(</span><span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""This is a shorthand for 'print_exception(sys.last_exc, limit=limit, file=file, chain=chain)'."""</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s2">"last_exc"</span><span class="p">)</span> <span class="ow">and</span> <span class="ow">not</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s2">"last_type"</span><span class="p">):</span>
|
|
<span class="k">raise</span> <span class="ne">ValueError</span><span class="p">(</span><span class="s2">"no last exception"</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="nb">hasattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s2">"last_exc"</span><span class="p">):</span>
|
|
<span class="n">print_exception</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">last_exc</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">print_exception</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">last_type</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">last_value</span><span class="p">,</span> <span class="n">sys</span><span class="o">.</span><span class="n">last_traceback</span><span class="p">,</span>
|
|
<span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">)</span>
|
|
|
|
|
|
<span class="c1">#</span>
|
|
<span class="c1"># Printing and Extracting Stacks.</span>
|
|
<span class="c1">#</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print_stack</span><span class="p">(</span><span class="n">f</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Print a stack trace from its invocation point.</span>
|
|
|
|
<span class="sd"> The optional 'f' argument can be used to specify an alternate</span>
|
|
<span class="sd"> stack frame at which to start. The optional 'limit' and 'file'</span>
|
|
<span class="sd"> arguments have the same meaning as for print_exception().</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">f</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">()</span><span class="o">.</span><span class="n">f_back</span>
|
|
<span class="n">print_list</span><span class="p">(</span><span class="n">extract_stack</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">),</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_stack</span><span class="p">(</span><span class="n">f</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Shorthand for 'format_list(extract_stack(f, limit))'."""</span>
|
|
<span class="k">if</span> <span class="n">f</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">()</span><span class="o">.</span><span class="n">f_back</span>
|
|
<span class="k">return</span> <span class="n">format_list</span><span class="p">(</span><span class="n">extract_stack</span><span class="p">(</span><span class="n">f</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">))</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">extract_stack</span><span class="p">(</span><span class="n">f</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Extract the raw traceback from the current stack frame.</span>
|
|
|
|
<span class="sd"> The return value has the same format as for extract_tb(). The</span>
|
|
<span class="sd"> optional 'f' and 'limit' arguments have the same meaning as for</span>
|
|
<span class="sd"> print_stack(). Each item in the list is a quadruple (filename,</span>
|
|
<span class="sd"> line number, function name, text), and the entries are in order</span>
|
|
<span class="sd"> from oldest to newest stack frame.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">f</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">()</span><span class="o">.</span><span class="n">f_back</span>
|
|
<span class="n">stack</span> <span class="o">=</span> <span class="n">StackSummary</span><span class="o">.</span><span class="n">extract</span><span class="p">(</span><span class="n">walk_stack</span><span class="p">(</span><span class="n">f</span><span class="p">),</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">)</span>
|
|
<span class="n">stack</span><span class="o">.</span><span class="n">reverse</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="n">stack</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">clear_frames</span><span class="p">(</span><span class="n">tb</span><span class="p">):</span>
|
|
<span class="s2">"Clear all references to local variables in the frames of a traceback."</span>
|
|
<span class="k">while</span> <span class="n">tb</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
|
|
<span class="k">except</span> <span class="ne">RuntimeError</span><span class="p">:</span>
|
|
<span class="c1"># Ignore the exception raised if the frame is still executing.</span>
|
|
<span class="k">pass</span>
|
|
<span class="n">tb</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">FrameSummary</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">"""Information about a single frame from a traceback.</span>
|
|
|
|
<span class="sd"> - :attr:`filename` The filename for the frame.</span>
|
|
<span class="sd"> - :attr:`lineno` The line within filename for the frame that was</span>
|
|
<span class="sd"> active when the frame was captured.</span>
|
|
<span class="sd"> - :attr:`name` The name of the function or method that was executing</span>
|
|
<span class="sd"> when the frame was captured.</span>
|
|
<span class="sd"> - :attr:`line` The text from the linecache module for the</span>
|
|
<span class="sd"> of code that was running when the frame was captured.</span>
|
|
<span class="sd"> - :attr:`locals` Either None if locals were not supplied, or a dict</span>
|
|
<span class="sd"> mapping the name to the repr() of the variable.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="vm">__slots__</span> <span class="o">=</span> <span class="p">(</span><span class="s1">'filename'</span><span class="p">,</span> <span class="s1">'lineno'</span><span class="p">,</span> <span class="s1">'end_lineno'</span><span class="p">,</span> <span class="s1">'colno'</span><span class="p">,</span> <span class="s1">'end_colno'</span><span class="p">,</span>
|
|
<span class="s1">'name'</span><span class="p">,</span> <span class="s1">'_lines'</span><span class="p">,</span> <span class="s1">'_lines_dedented'</span><span class="p">,</span> <span class="s1">'locals'</span><span class="p">,</span> <span class="s1">'_code'</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">lookup_line</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
<span class="nb">locals</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">line</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">end_lineno</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">colno</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">end_colno</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Construct a FrameSummary.</span>
|
|
|
|
<span class="sd"> :param lookup_line: If True, `linecache` is consulted for the source</span>
|
|
<span class="sd"> code line. Otherwise, the line will be looked up when first needed.</span>
|
|
<span class="sd"> :param locals: If supplied the frame locals, which will be captured as</span>
|
|
<span class="sd"> object representations.</span>
|
|
<span class="sd"> :param line: If provided, use this instead of looking up the line in</span>
|
|
<span class="sd"> the linecache.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">filename</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">=</span> <span class="n">lineno</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">=</span> <span class="n">lineno</span> <span class="k">if</span> <span class="n">end_lineno</span> <span class="ow">is</span> <span class="kc">None</span> <span class="k">else</span> <span class="n">end_lineno</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">colno</span> <span class="o">=</span> <span class="n">colno</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">end_colno</span> <span class="o">=</span> <span class="n">end_colno</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">=</span> <span class="n">name</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_code</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"_code"</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_lines</span> <span class="o">=</span> <span class="n">line</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_lines_dedented</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">lookup_line</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">line</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">locals</span> <span class="o">=</span> <span class="p">{</span><span class="n">k</span><span class="p">:</span> <span class="n">_safe_string</span><span class="p">(</span><span class="n">v</span><span class="p">,</span> <span class="s1">'local'</span><span class="p">,</span> <span class="n">func</span><span class="o">=</span><span class="nb">repr</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="nb">locals</span><span class="o">.</span><span class="n">items</span><span class="p">()}</span> <span class="k">if</span> <span class="nb">locals</span> <span class="k">else</span> <span class="kc">None</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">FrameSummary</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">filename</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">lineno</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">name</span> <span class="ow">and</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">locals</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="n">locals</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="nb">tuple</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">)</span> <span class="o">==</span> <span class="n">other</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__getitem__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">pos</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">)[</span><span class="n">pos</span><span class="p">]</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__iter__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="nb">iter</span><span class="p">([</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">line</span><span class="p">])</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s2">"<FrameSummary file </span><span class="si">{filename}</span><span class="s2">, line </span><span class="si">{lineno}</span><span class="s2"> in </span><span class="si">{name}</span><span class="s2">>"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">filename</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="n">name</span><span class="o">=</span><span class="bp">self</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__len__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="mi">4</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_set_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_lines</span> <span class="ow">is</span> <span class="kc">None</span>
|
|
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">end_lineno</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="p">):</span>
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">lineno</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">+</span> <span class="mi">1</span><span class="p">):</span>
|
|
<span class="c1"># treat errors (empty string) and empty lines (newline) as the same</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="n">linecache</span><span class="o">.</span><span class="n">getline</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">line</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_code</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"<"</span><span class="p">):</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="n">linecache</span><span class="o">.</span><span class="n">_getline_from_code</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_code</span><span class="p">,</span> <span class="n">lineno</span><span class="p">)</span><span class="o">.</span><span class="n">rstrip</span><span class="p">()</span>
|
|
<span class="n">lines</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_lines</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_original_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># Returns the line as-is from the source, without modifying whitespace.</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_set_lines</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lines</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_dedented_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="c1"># Returns _original_lines, but dedented</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_set_lines</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lines_dedented</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lines</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_lines_dedented</span> <span class="o">=</span> <span class="n">textwrap</span><span class="o">.</span><span class="n">dedent</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">_lines</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lines_dedented</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">line</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_set_lines</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lines</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="c1"># return only the first line, stripped</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_lines</span><span class="o">.</span><span class="n">partition</span><span class="p">(</span><span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">walk_stack</span><span class="p">(</span><span class="n">f</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Walk a stack yielding the frame and line number for each frame.</span>
|
|
|
|
<span class="sd"> This will follow f.f_back from the given frame. If no frame is given, the</span>
|
|
<span class="sd"> current stack is used. Usually used with StackSummary.extract.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">if</span> <span class="n">f</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">_getframe</span><span class="p">()</span><span class="o">.</span><span class="n">f_back</span><span class="o">.</span><span class="n">f_back</span><span class="o">.</span><span class="n">f_back</span><span class="o">.</span><span class="n">f_back</span>
|
|
<span class="k">while</span> <span class="n">f</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">f</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">f_lineno</span>
|
|
<span class="n">f</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">f_back</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">walk_tb</span><span class="p">(</span><span class="n">tb</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Walk a traceback yielding the frame and line number for each frame.</span>
|
|
|
|
<span class="sd"> This will follow tb.tb_next (and thus is in the opposite order to</span>
|
|
<span class="sd"> walk_stack). Usually used with StackSummary.extract.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">while</span> <span class="n">tb</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span><span class="p">,</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_lineno</span>
|
|
<span class="n">tb</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_walk_tb_with_full_positions</span><span class="p">(</span><span class="n">tb</span><span class="p">):</span>
|
|
<span class="c1"># Internal version of walk_tb that yields full code positions including</span>
|
|
<span class="c1"># end line and column information.</span>
|
|
<span class="k">while</span> <span class="n">tb</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">positions</span> <span class="o">=</span> <span class="n">_get_code_position</span><span class="p">(</span><span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span><span class="o">.</span><span class="n">f_code</span><span class="p">,</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_lasti</span><span class="p">)</span>
|
|
<span class="c1"># Yield tb_lineno when co_positions does not have a line number to</span>
|
|
<span class="c1"># maintain behavior with walk_tb.</span>
|
|
<span class="k">if</span> <span class="n">positions</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span><span class="p">,</span> <span class="p">(</span><span class="n">tb</span><span class="o">.</span><span class="n">tb_lineno</span><span class="p">,</span> <span class="p">)</span> <span class="o">+</span> <span class="n">positions</span><span class="p">[</span><span class="mi">1</span><span class="p">:]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span><span class="p">,</span> <span class="n">positions</span>
|
|
<span class="n">tb</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_get_code_position</span><span class="p">(</span><span class="n">code</span><span class="p">,</span> <span class="n">instruction_index</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">instruction_index</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">positions_gen</span> <span class="o">=</span> <span class="n">code</span><span class="o">.</span><span class="n">co_positions</span><span class="p">()</span>
|
|
<span class="k">return</span> <span class="nb">next</span><span class="p">(</span><span class="n">itertools</span><span class="o">.</span><span class="n">islice</span><span class="p">(</span><span class="n">positions_gen</span><span class="p">,</span> <span class="n">instruction_index</span> <span class="o">//</span> <span class="mi">2</span><span class="p">,</span> <span class="kc">None</span><span class="p">))</span>
|
|
|
|
|
|
<span class="n">_RECURSIVE_CUTOFF</span> <span class="o">=</span> <span class="mi">3</span> <span class="c1"># Also hardcoded in traceback.c.</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">StackSummary</span><span class="p">(</span><span class="nb">list</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""A list of FrameSummary objects, representing a stack of frames."""</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">extract</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">frame_gen</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">lookup_lines</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span>
|
|
<span class="n">capture_locals</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create a StackSummary from a traceback or stack object.</span>
|
|
|
|
<span class="sd"> :param frame_gen: A generator that yields (frame, lineno) tuples</span>
|
|
<span class="sd"> whose summaries are to be included in the stack.</span>
|
|
<span class="sd"> :param limit: None to include all frames or the number of frames to</span>
|
|
<span class="sd"> include.</span>
|
|
<span class="sd"> :param lookup_lines: If True, lookup lines for each frame immediately,</span>
|
|
<span class="sd"> otherwise lookup is deferred until the frame is rendered.</span>
|
|
<span class="sd"> :param capture_locals: If True, the local variables from each frame will</span>
|
|
<span class="sd"> be captured as object representations into the FrameSummary.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">extended_frame_gen</span><span class="p">():</span>
|
|
<span class="k">for</span> <span class="n">f</span><span class="p">,</span> <span class="n">lineno</span> <span class="ow">in</span> <span class="n">frame_gen</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">f</span><span class="p">,</span> <span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="n">klass</span><span class="o">.</span><span class="n">_extract_from_extended_frame_gen</span><span class="p">(</span>
|
|
<span class="n">extended_frame_gen</span><span class="p">(),</span> <span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">lookup_lines</span><span class="o">=</span><span class="n">lookup_lines</span><span class="p">,</span>
|
|
<span class="n">capture_locals</span><span class="o">=</span><span class="n">capture_locals</span><span class="p">)</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_extract_from_extended_frame_gen</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">frame_gen</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">lookup_lines</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_locals</span><span class="o">=</span><span class="kc">False</span><span class="p">):</span>
|
|
<span class="c1"># Same as extract but operates on a frame generator that yields</span>
|
|
<span class="c1"># (frame, (lineno, end_lineno, colno, end_colno)) in the stack.</span>
|
|
<span class="c1"># Only lineno is required, the remaining fields can be None if the</span>
|
|
<span class="c1"># information is not available.</span>
|
|
<span class="n">builtin_limit</span> <span class="o">=</span> <span class="n">limit</span> <span class="ow">is</span> <span class="n">BUILTIN_EXCEPTION_LIMIT</span>
|
|
<span class="k">if</span> <span class="n">limit</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">builtin_limit</span><span class="p">:</span>
|
|
<span class="n">limit</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">sys</span><span class="p">,</span> <span class="s1">'tracebacklimit'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">limit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">limit</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">limit</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">if</span> <span class="n">limit</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">builtin_limit</span><span class="p">:</span>
|
|
<span class="n">frame_gen</span> <span class="o">=</span> <span class="nb">tuple</span><span class="p">(</span><span class="n">frame_gen</span><span class="p">)</span>
|
|
<span class="n">frame_gen</span> <span class="o">=</span> <span class="n">frame_gen</span><span class="p">[</span><span class="nb">len</span><span class="p">(</span><span class="n">frame_gen</span><span class="p">)</span> <span class="o">-</span> <span class="n">limit</span><span class="p">:]</span>
|
|
<span class="k">elif</span> <span class="n">limit</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">frame_gen</span> <span class="o">=</span> <span class="n">itertools</span><span class="o">.</span><span class="n">islice</span><span class="p">(</span><span class="n">frame_gen</span><span class="p">,</span> <span class="n">limit</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">frame_gen</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">deque</span><span class="p">(</span><span class="n">frame_gen</span><span class="p">,</span> <span class="n">maxlen</span><span class="o">=-</span><span class="n">limit</span><span class="p">)</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">klass</span><span class="p">()</span>
|
|
<span class="n">fnames</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">f</span><span class="p">,</span> <span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">end_lineno</span><span class="p">,</span> <span class="n">colno</span><span class="p">,</span> <span class="n">end_colno</span><span class="p">)</span> <span class="ow">in</span> <span class="n">frame_gen</span><span class="p">:</span>
|
|
<span class="n">co</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">f_code</span>
|
|
<span class="n">filename</span> <span class="o">=</span> <span class="n">co</span><span class="o">.</span><span class="n">co_filename</span>
|
|
<span class="n">name</span> <span class="o">=</span> <span class="n">co</span><span class="o">.</span><span class="n">co_name</span>
|
|
<span class="n">fnames</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
|
|
<span class="n">linecache</span><span class="o">.</span><span class="n">lazycache</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">f</span><span class="o">.</span><span class="n">f_globals</span><span class="p">)</span>
|
|
<span class="c1"># Must defer line lookups until we have called checkcache.</span>
|
|
<span class="k">if</span> <span class="n">capture_locals</span><span class="p">:</span>
|
|
<span class="n">f_locals</span> <span class="o">=</span> <span class="n">f</span><span class="o">.</span><span class="n">f_locals</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">f_locals</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="n">FrameSummary</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span>
|
|
<span class="n">lookup_line</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="nb">locals</span><span class="o">=</span><span class="n">f_locals</span><span class="p">,</span>
|
|
<span class="n">end_lineno</span><span class="o">=</span><span class="n">end_lineno</span><span class="p">,</span> <span class="n">colno</span><span class="o">=</span><span class="n">colno</span><span class="p">,</span> <span class="n">end_colno</span><span class="o">=</span><span class="n">end_colno</span><span class="p">,</span>
|
|
<span class="n">_code</span><span class="o">=</span><span class="n">f</span><span class="o">.</span><span class="n">f_code</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">filename</span> <span class="ow">in</span> <span class="n">fnames</span><span class="p">:</span>
|
|
<span class="n">linecache</span><span class="o">.</span><span class="n">checkcache</span><span class="p">(</span><span class="n">filename</span><span class="p">)</span>
|
|
|
|
<span class="c1"># If immediate lookup was desired, trigger lookups now.</span>
|
|
<span class="k">if</span> <span class="n">lookup_lines</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">f</span> <span class="ow">in</span> <span class="n">result</span><span class="p">:</span>
|
|
<span class="n">f</span><span class="o">.</span><span class="n">line</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">from_list</span><span class="p">(</span><span class="n">klass</span><span class="p">,</span> <span class="n">a_list</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Create a StackSummary object from a supplied list of</span>
|
|
<span class="sd"> FrameSummary objects or old-style list of tuples.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># While doing a fast-path check for isinstance(a_list, StackSummary) is</span>
|
|
<span class="c1"># appealing, idlelib.run.cleanup_traceback and other similar code may</span>
|
|
<span class="c1"># break this by making arbitrary frames plain tuples, so we need to</span>
|
|
<span class="c1"># check on a frame by frame basis.</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="n">StackSummary</span><span class="p">()</span>
|
|
<span class="k">for</span> <span class="n">frame</span> <span class="ow">in</span> <span class="n">a_list</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">frame</span><span class="p">,</span> <span class="n">FrameSummary</span><span class="p">):</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">frame</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">line</span> <span class="o">=</span> <span class="n">frame</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">FrameSummary</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="n">line</span><span class="o">=</span><span class="n">line</span><span class="p">))</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_frame_summary</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">frame_summary</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format the lines for a single FrameSummary.</span>
|
|
|
|
<span class="sd"> Returns a string representing one frame involved in the stack. This</span>
|
|
<span class="sd"> gets called for every frame to be printed in the stack summary.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">row</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">filename</span> <span class="o">=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">filename</span>
|
|
<span class="k">if</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">filename</span><span class="o">.</span><span class="n">startswith</span><span class="p">(</span><span class="s2">"<stdin-"</span><span class="p">)</span> <span class="ow">and</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">filename</span><span class="o">.</span><span class="n">endswith</span><span class="p">(</span><span class="s1">'>'</span><span class="p">):</span>
|
|
<span class="n">filename</span> <span class="o">=</span> <span class="s2">"<stdin>"</span>
|
|
<span class="k">if</span> <span class="n">colorize</span><span class="p">:</span>
|
|
<span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">' File </span><span class="si">{}</span><span class="s1">"</span><span class="si">{}</span><span class="s1">"</span><span class="si">{}</span><span class="s1">, line </span><span class="si">{}{}{}</span><span class="s1">, in </span><span class="si">{}{}{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">,</span>
|
|
<span class="n">filename</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">,</span>
|
|
<span class="n">frame_summary</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">,</span>
|
|
<span class="n">frame_summary</span><span class="o">.</span><span class="n">name</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">' File "</span><span class="si">{}</span><span class="s1">", line </span><span class="si">{}</span><span class="s1">, in </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">filename</span><span class="p">,</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">name</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">_dedented_lines</span> <span class="ow">and</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">_dedented_lines</span><span class="o">.</span><span class="n">strip</span><span class="p">():</span>
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="n">frame_summary</span><span class="o">.</span><span class="n">colno</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span>
|
|
<span class="n">frame_summary</span><span class="o">.</span><span class="n">end_colno</span> <span class="ow">is</span> <span class="kc">None</span>
|
|
<span class="p">):</span>
|
|
<span class="c1"># only output first line if column information is missing</span>
|
|
<span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">textwrap</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">frame_summary</span><span class="o">.</span><span class="n">line</span><span class="p">,</span> <span class="s1">' '</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># get first and last line</span>
|
|
<span class="n">all_lines_original</span> <span class="o">=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">_original_lines</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
|
|
<span class="n">first_line</span> <span class="o">=</span> <span class="n">all_lines_original</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="c1"># assume all_lines_original has enough lines (since we constructed it)</span>
|
|
<span class="n">last_line</span> <span class="o">=</span> <span class="n">all_lines_original</span><span class="p">[</span><span class="n">frame_summary</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">-</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">lineno</span><span class="p">]</span>
|
|
|
|
<span class="c1"># character index of the start/end of the instruction</span>
|
|
<span class="n">start_offset</span> <span class="o">=</span> <span class="n">_byte_offset_to_character_offset</span><span class="p">(</span><span class="n">first_line</span><span class="p">,</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">colno</span><span class="p">)</span>
|
|
<span class="n">end_offset</span> <span class="o">=</span> <span class="n">_byte_offset_to_character_offset</span><span class="p">(</span><span class="n">last_line</span><span class="p">,</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">end_colno</span><span class="p">)</span>
|
|
|
|
<span class="n">all_lines</span> <span class="o">=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">_dedented_lines</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()[</span>
|
|
<span class="p">:</span><span class="n">frame_summary</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">-</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">lineno</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="p">]</span>
|
|
|
|
<span class="c1"># adjust start/end offset based on dedent</span>
|
|
<span class="n">dedent_characters</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">first_line</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
|
|
<span class="n">start_offset</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">start_offset</span> <span class="o">-</span> <span class="n">dedent_characters</span><span class="p">)</span>
|
|
<span class="n">end_offset</span> <span class="o">=</span> <span class="nb">max</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">end_offset</span> <span class="o">-</span> <span class="n">dedent_characters</span><span class="p">)</span>
|
|
|
|
<span class="c1"># When showing this on a terminal, some of the non-ASCII characters</span>
|
|
<span class="c1"># might be rendered as double-width characters, so we need to take</span>
|
|
<span class="c1"># that into account when calculating the length of the line.</span>
|
|
<span class="n">dp_start_offset</span> <span class="o">=</span> <span class="n">_display_width</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">offset</span><span class="o">=</span><span class="n">start_offset</span><span class="p">)</span>
|
|
<span class="n">dp_end_offset</span> <span class="o">=</span> <span class="n">_display_width</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">],</span> <span class="n">offset</span><span class="o">=</span><span class="n">end_offset</span><span class="p">)</span>
|
|
|
|
<span class="c1"># get exact code segment corresponding to the instruction</span>
|
|
<span class="n">segment</span> <span class="o">=</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">all_lines</span><span class="p">)</span>
|
|
<span class="n">segment</span> <span class="o">=</span> <span class="n">segment</span><span class="p">[</span><span class="n">start_offset</span><span class="p">:</span><span class="nb">len</span><span class="p">(</span><span class="n">segment</span><span class="p">)</span> <span class="o">-</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="n">end_offset</span><span class="p">)]</span>
|
|
|
|
<span class="c1"># attempt to parse for anchors</span>
|
|
<span class="n">anchors</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">show_carets</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">with</span> <span class="n">suppress</span><span class="p">(</span><span class="ne">Exception</span><span class="p">):</span>
|
|
<span class="n">anchors</span> <span class="o">=</span> <span class="n">_extract_caret_anchors_from_line_segment</span><span class="p">(</span><span class="n">segment</span><span class="p">)</span>
|
|
<span class="n">show_carets</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">_should_show_carets</span><span class="p">(</span><span class="n">start_offset</span><span class="p">,</span> <span class="n">end_offset</span><span class="p">,</span> <span class="n">all_lines</span><span class="p">,</span> <span class="n">anchors</span><span class="p">)</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="c1"># only display first line, last line, and lines around anchor start/end</span>
|
|
<span class="n">significant_lines</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span><span class="p">}</span>
|
|
|
|
<span class="n">anchors_left_end_offset</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">anchors_right_start_offset</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">primary_char</span> <span class="o">=</span> <span class="s2">"^"</span>
|
|
<span class="n">secondary_char</span> <span class="o">=</span> <span class="s2">"^"</span>
|
|
<span class="k">if</span> <span class="n">anchors</span><span class="p">:</span>
|
|
<span class="n">anchors_left_end_offset</span> <span class="o">=</span> <span class="n">anchors</span><span class="o">.</span><span class="n">left_end_offset</span>
|
|
<span class="n">anchors_right_start_offset</span> <span class="o">=</span> <span class="n">anchors</span><span class="o">.</span><span class="n">right_start_offset</span>
|
|
<span class="c1"># computed anchor positions do not take start_offset into account,</span>
|
|
<span class="c1"># so account for it here</span>
|
|
<span class="k">if</span> <span class="n">anchors</span><span class="o">.</span><span class="n">left_end_lineno</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">anchors_left_end_offset</span> <span class="o">+=</span> <span class="n">start_offset</span>
|
|
<span class="k">if</span> <span class="n">anchors</span><span class="o">.</span><span class="n">right_start_lineno</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">anchors_right_start_offset</span> <span class="o">+=</span> <span class="n">start_offset</span>
|
|
|
|
<span class="c1"># account for display width</span>
|
|
<span class="n">anchors_left_end_offset</span> <span class="o">=</span> <span class="n">_display_width</span><span class="p">(</span>
|
|
<span class="n">all_lines</span><span class="p">[</span><span class="n">anchors</span><span class="o">.</span><span class="n">left_end_lineno</span><span class="p">],</span> <span class="n">offset</span><span class="o">=</span><span class="n">anchors_left_end_offset</span>
|
|
<span class="p">)</span>
|
|
<span class="n">anchors_right_start_offset</span> <span class="o">=</span> <span class="n">_display_width</span><span class="p">(</span>
|
|
<span class="n">all_lines</span><span class="p">[</span><span class="n">anchors</span><span class="o">.</span><span class="n">right_start_lineno</span><span class="p">],</span> <span class="n">offset</span><span class="o">=</span><span class="n">anchors_right_start_offset</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="n">primary_char</span> <span class="o">=</span> <span class="n">anchors</span><span class="o">.</span><span class="n">primary_char</span>
|
|
<span class="n">secondary_char</span> <span class="o">=</span> <span class="n">anchors</span><span class="o">.</span><span class="n">secondary_char</span>
|
|
<span class="n">significant_lines</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
|
|
<span class="nb">range</span><span class="p">(</span><span class="n">anchors</span><span class="o">.</span><span class="n">left_end_lineno</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">anchors</span><span class="o">.</span><span class="n">left_end_lineno</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="n">significant_lines</span><span class="o">.</span><span class="n">update</span><span class="p">(</span>
|
|
<span class="nb">range</span><span class="p">(</span><span class="n">anchors</span><span class="o">.</span><span class="n">right_start_lineno</span> <span class="o">-</span> <span class="mi">1</span><span class="p">,</span> <span class="n">anchors</span><span class="o">.</span><span class="n">right_start_lineno</span> <span class="o">+</span> <span class="mi">2</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="c1"># remove bad line numbers</span>
|
|
<span class="n">significant_lines</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">significant_lines</span><span class="o">.</span><span class="n">discard</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">))</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">output_line</span><span class="p">(</span><span class="n">lineno</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""output all_lines[lineno] along with carets"""</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">show_carets</span><span class="p">:</span>
|
|
<span class="k">return</span>
|
|
<span class="n">num_spaces</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">])</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">]</span><span class="o">.</span><span class="n">lstrip</span><span class="p">())</span>
|
|
<span class="n">carets</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">num_carets</span> <span class="o">=</span> <span class="n">dp_end_offset</span> <span class="k">if</span> <span class="n">lineno</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">)</span> <span class="o">-</span> <span class="mi">1</span> <span class="k">else</span> <span class="n">_display_width</span><span class="p">(</span><span class="n">all_lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">])</span>
|
|
<span class="c1"># compute caret character for each position</span>
|
|
<span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">num_carets</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">col</span> <span class="o"><</span> <span class="n">num_spaces</span> <span class="ow">or</span> <span class="p">(</span><span class="n">lineno</span> <span class="o">==</span> <span class="mi">0</span> <span class="ow">and</span> <span class="n">col</span> <span class="o"><</span> <span class="n">dp_start_offset</span><span class="p">):</span>
|
|
<span class="c1"># before first non-ws char of the line, or before start of instruction</span>
|
|
<span class="n">carets</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">' '</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">anchors</span> <span class="ow">and</span> <span class="p">(</span>
|
|
<span class="n">lineno</span> <span class="o">></span> <span class="n">anchors</span><span class="o">.</span><span class="n">left_end_lineno</span> <span class="ow">or</span>
|
|
<span class="p">(</span><span class="n">lineno</span> <span class="o">==</span> <span class="n">anchors</span><span class="o">.</span><span class="n">left_end_lineno</span> <span class="ow">and</span> <span class="n">col</span> <span class="o">>=</span> <span class="n">anchors_left_end_offset</span><span class="p">)</span>
|
|
<span class="p">)</span> <span class="ow">and</span> <span class="p">(</span>
|
|
<span class="n">lineno</span> <span class="o"><</span> <span class="n">anchors</span><span class="o">.</span><span class="n">right_start_lineno</span> <span class="ow">or</span>
|
|
<span class="p">(</span><span class="n">lineno</span> <span class="o">==</span> <span class="n">anchors</span><span class="o">.</span><span class="n">right_start_lineno</span> <span class="ow">and</span> <span class="n">col</span> <span class="o"><</span> <span class="n">anchors_right_start_offset</span><span class="p">)</span>
|
|
<span class="p">):</span>
|
|
<span class="c1"># within anchors</span>
|
|
<span class="n">carets</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">secondary_char</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">carets</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">primary_char</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">colorize</span><span class="p">:</span>
|
|
<span class="c1"># Replace the previous line with a red version of it only in the parts covered</span>
|
|
<span class="c1"># by the carets.</span>
|
|
<span class="n">line</span> <span class="o">=</span> <span class="n">result</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
|
|
<span class="n">colorized_line_parts</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">colorized_carets_parts</span> <span class="o">=</span> <span class="p">[]</span>
|
|
|
|
<span class="k">for</span> <span class="n">color</span><span class="p">,</span> <span class="n">group</span> <span class="ow">in</span> <span class="n">itertools</span><span class="o">.</span><span class="n">groupby</span><span class="p">(</span><span class="n">itertools</span><span class="o">.</span><span class="n">zip_longest</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">carets</span><span class="p">,</span> <span class="n">fillvalue</span><span class="o">=</span><span class="s2">""</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">[</span><span class="mi">1</span><span class="p">]):</span>
|
|
<span class="n">caret_group</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">group</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">color</span> <span class="o">==</span> <span class="s2">"^"</span><span class="p">:</span>
|
|
<span class="n">colorized_line_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_RED</span> <span class="o">+</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">char</span> <span class="k">for</span> <span class="n">char</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">caret_group</span><span class="p">)</span> <span class="o">+</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">)</span>
|
|
<span class="n">colorized_carets_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_RED</span> <span class="o">+</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">caret</span> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">caret</span> <span class="ow">in</span> <span class="n">caret_group</span><span class="p">)</span> <span class="o">+</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">color</span> <span class="o">==</span> <span class="s2">"~"</span><span class="p">:</span>
|
|
<span class="n">colorized_line_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">RED</span> <span class="o">+</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">char</span> <span class="k">for</span> <span class="n">char</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">caret_group</span><span class="p">)</span> <span class="o">+</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">)</span>
|
|
<span class="n">colorized_carets_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">ANSIColors</span><span class="o">.</span><span class="n">RED</span> <span class="o">+</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">caret</span> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">caret</span> <span class="ow">in</span> <span class="n">caret_group</span><span class="p">)</span> <span class="o">+</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">colorized_line_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">char</span> <span class="k">for</span> <span class="n">char</span><span class="p">,</span> <span class="n">_</span> <span class="ow">in</span> <span class="n">caret_group</span><span class="p">))</span>
|
|
<span class="n">colorized_carets_parts</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">caret</span> <span class="k">for</span> <span class="n">_</span><span class="p">,</span> <span class="n">caret</span> <span class="ow">in</span> <span class="n">caret_group</span><span class="p">))</span>
|
|
|
|
<span class="n">colorized_line</span> <span class="o">=</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">colorized_line_parts</span><span class="p">)</span>
|
|
<span class="n">colorized_carets</span> <span class="o">=</span> <span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">colorized_carets_parts</span><span class="p">)</span>
|
|
<span class="n">result</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="n">colorized_line</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">colorized_carets</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">carets</span><span class="p">)</span> <span class="o">+</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="c1"># display significant lines</span>
|
|
<span class="n">sig_lines_list</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">significant_lines</span><span class="p">)</span>
|
|
<span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">lineno</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">sig_lines_list</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">i</span><span class="p">:</span>
|
|
<span class="n">linediff</span> <span class="o">=</span> <span class="n">lineno</span> <span class="o">-</span> <span class="n">sig_lines_list</span><span class="p">[</span><span class="n">i</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">linediff</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="c1"># 1 line in between - just output it</span>
|
|
<span class="n">output_line</span><span class="p">(</span><span class="n">lineno</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="n">linediff</span> <span class="o">></span> <span class="mi">2</span><span class="p">:</span>
|
|
<span class="c1"># > 1 line in between - abbreviate</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="sa">f</span><span class="s2">"...<</span><span class="si">{</span><span class="n">linediff</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="si">}</span><span class="s2"> lines>...</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="n">output_line</span><span class="p">(</span><span class="n">lineno</span><span class="p">)</span>
|
|
|
|
<span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="n">textwrap</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">textwrap</span><span class="o">.</span><span class="n">dedent</span><span class="p">(</span><span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">result</span><span class="p">)),</span> <span class="s1">' '</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">line</span><span class="p">:</span> <span class="kc">True</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">locals</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">value</span> <span class="ow">in</span> <span class="nb">sorted</span><span class="p">(</span><span class="n">frame_summary</span><span class="o">.</span><span class="n">locals</span><span class="o">.</span><span class="n">items</span><span class="p">()):</span>
|
|
<span class="n">row</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="s1">' </span><span class="si">{name}</span><span class="s1"> = </span><span class="si">{value}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">name</span><span class="p">,</span> <span class="n">value</span><span class="o">=</span><span class="n">value</span><span class="p">))</span>
|
|
|
|
<span class="k">return</span> <span class="s1">''</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">row</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_should_show_carets</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">start_offset</span><span class="p">,</span> <span class="n">end_offset</span><span class="p">,</span> <span class="n">all_lines</span><span class="p">,</span> <span class="n">anchors</span><span class="p">):</span>
|
|
<span class="k">with</span> <span class="n">suppress</span><span class="p">(</span><span class="ne">SyntaxError</span><span class="p">,</span> <span class="ne">ImportError</span><span class="p">):</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">ast</span>
|
|
<span class="n">tree</span> <span class="o">=</span> <span class="n">ast</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">all_lines</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="n">statement</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_spawns_full_line</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="p">(</span>
|
|
<span class="n">value</span><span class="o">.</span><span class="n">lineno</span> <span class="o">==</span> <span class="mi">1</span>
|
|
<span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">==</span> <span class="nb">len</span><span class="p">(</span><span class="n">all_lines</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">col_offset</span> <span class="o">==</span> <span class="n">start_offset</span>
|
|
<span class="ow">and</span> <span class="n">value</span><span class="o">.</span><span class="n">end_col_offset</span> <span class="o">==</span> <span class="n">end_offset</span>
|
|
<span class="p">)</span>
|
|
<span class="k">match</span> <span class="n">statement</span><span class="p">:</span>
|
|
<span class="k">case</span> <span class="n">ast</span><span class="o">.</span><span class="n">Return</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">ast</span><span class="o">.</span><span class="n">Call</span><span class="p">()):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">statement</span><span class="o">.</span><span class="n">value</span><span class="o">.</span><span class="n">func</span><span class="p">,</span> <span class="n">ast</span><span class="o">.</span><span class="n">Name</span><span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">statement</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="k">case</span> <span class="n">ast</span><span class="o">.</span><span class="n">Assign</span><span class="p">(</span><span class="n">value</span><span class="o">=</span><span class="n">ast</span><span class="o">.</span><span class="n">Call</span><span class="p">()):</span>
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="nb">len</span><span class="p">(</span><span class="n">statement</span><span class="o">.</span><span class="n">targets</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span> <span class="ow">and</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="n">statement</span><span class="o">.</span><span class="n">targets</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span> <span class="n">ast</span><span class="o">.</span><span class="n">Name</span><span class="p">)</span>
|
|
<span class="p">):</span>
|
|
<span class="n">value</span> <span class="o">=</span> <span class="n">statement</span><span class="o">.</span><span class="n">value</span>
|
|
<span class="k">if</span> <span class="n">value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">_spawns_full_line</span><span class="p">(</span><span class="n">value</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">anchors</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="n">all_lines</span><span class="p">[</span><span class="mi">0</span><span class="p">][:</span><span class="n">start_offset</span><span class="p">]</span><span class="o">.</span><span class="n">lstrip</span><span class="p">()</span> <span class="ow">or</span> <span class="n">all_lines</span><span class="p">[</span><span class="o">-</span><span class="mi">1</span><span class="p">][</span><span class="n">end_offset</span><span class="p">:]</span><span class="o">.</span><span class="n">rstrip</span><span class="p">():</span>
|
|
<span class="k">return</span> <span class="kc">True</span>
|
|
<span class="k">return</span> <span class="kc">False</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format the stack ready for printing.</span>
|
|
|
|
<span class="sd"> Returns a list of strings ready for printing. Each string in the</span>
|
|
<span class="sd"> resulting list corresponds to a single frame from the stack.</span>
|
|
<span class="sd"> Each string ends in a newline; the strings may contain internal</span>
|
|
<span class="sd"> newlines as well, for those items with source text lines.</span>
|
|
|
|
<span class="sd"> For long sequences of the same frame and line, the first few</span>
|
|
<span class="sd"> repetitions are shown, followed by a summary line stating the exact</span>
|
|
<span class="sd"> number of further repetitions.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">last_file</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">last_line</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">last_name</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">for</span> <span class="n">frame_summary</span> <span class="ow">in</span> <span class="bp">self</span><span class="p">:</span>
|
|
<span class="n">formatted_frame</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">format_frame_summary</span><span class="p">(</span><span class="n">frame_summary</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">formatted_frame</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">last_file</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">last_file</span> <span class="o">!=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">filename</span> <span class="ow">or</span>
|
|
<span class="n">last_line</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">last_line</span> <span class="o">!=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">lineno</span> <span class="ow">or</span>
|
|
<span class="n">last_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="n">last_name</span> <span class="o">!=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">name</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">count</span> <span class="o">></span> <span class="n">_RECURSIVE_CUTOFF</span><span class="p">:</span>
|
|
<span class="n">count</span> <span class="o">-=</span> <span class="n">_RECURSIVE_CUTOFF</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">' [Previous line repeated </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s1"> more '</span>
|
|
<span class="sa">f</span><span class="s1">'time</span><span class="si">{</span><span class="s2">"s"</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s2">""</span><span class="si">}</span><span class="s1">]</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="p">)</span>
|
|
<span class="n">last_file</span> <span class="o">=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">filename</span>
|
|
<span class="n">last_line</span> <span class="o">=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">lineno</span>
|
|
<span class="n">last_name</span> <span class="o">=</span> <span class="n">frame_summary</span><span class="o">.</span><span class="n">name</span>
|
|
<span class="n">count</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">count</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="n">count</span> <span class="o">></span> <span class="n">_RECURSIVE_CUTOFF</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">formatted_frame</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">count</span> <span class="o">></span> <span class="n">_RECURSIVE_CUTOFF</span><span class="p">:</span>
|
|
<span class="n">count</span> <span class="o">-=</span> <span class="n">_RECURSIVE_CUTOFF</span>
|
|
<span class="n">result</span><span class="o">.</span><span class="n">append</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s1">' [Previous line repeated </span><span class="si">{</span><span class="n">count</span><span class="si">}</span><span class="s1"> more '</span>
|
|
<span class="sa">f</span><span class="s1">'time</span><span class="si">{</span><span class="s2">"s"</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">count</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="k">else</span><span class="w"> </span><span class="s2">""</span><span class="si">}</span><span class="s1">]</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_byte_offset_to_character_offset</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
|
|
<span class="n">as_utf8</span> <span class="o">=</span> <span class="nb">str</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s1">'utf-8'</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="nb">len</span><span class="p">(</span><span class="n">as_utf8</span><span class="p">[:</span><span class="n">offset</span><span class="p">]</span><span class="o">.</span><span class="n">decode</span><span class="p">(</span><span class="s2">"utf-8"</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s2">"replace"</span><span class="p">))</span>
|
|
|
|
|
|
<span class="n">_Anchors</span> <span class="o">=</span> <span class="n">collections</span><span class="o">.</span><span class="n">namedtuple</span><span class="p">(</span>
|
|
<span class="s2">"_Anchors"</span><span class="p">,</span>
|
|
<span class="p">[</span>
|
|
<span class="s2">"left_end_lineno"</span><span class="p">,</span>
|
|
<span class="s2">"left_end_offset"</span><span class="p">,</span>
|
|
<span class="s2">"right_start_lineno"</span><span class="p">,</span>
|
|
<span class="s2">"right_start_offset"</span><span class="p">,</span>
|
|
<span class="s2">"primary_char"</span><span class="p">,</span>
|
|
<span class="s2">"secondary_char"</span><span class="p">,</span>
|
|
<span class="p">],</span>
|
|
<span class="n">defaults</span><span class="o">=</span><span class="p">[</span><span class="s2">"~"</span><span class="p">,</span> <span class="s2">"^"</span><span class="p">]</span>
|
|
<span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_extract_caret_anchors_from_line_segment</span><span class="p">(</span><span class="n">segment</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""</span>
|
|
<span class="sd"> Given source code `segment` corresponding to a FrameSummary, determine:</span>
|
|
<span class="sd"> - for binary ops, the location of the binary op</span>
|
|
<span class="sd"> - for indexing and function calls, the location of the brackets.</span>
|
|
<span class="sd"> `segment` is expected to be a valid Python expression.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">ast</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="c1"># Without parentheses, `segment` is parsed as a statement.</span>
|
|
<span class="c1"># Binary ops, subscripts, and calls are expressions, so</span>
|
|
<span class="c1"># we can wrap them with parentheses to parse them as</span>
|
|
<span class="c1"># (possibly multi-line) expressions.</span>
|
|
<span class="c1"># e.g. if we try to highlight the addition in</span>
|
|
<span class="c1"># x = (</span>
|
|
<span class="c1"># a +</span>
|
|
<span class="c1"># b</span>
|
|
<span class="c1"># )</span>
|
|
<span class="c1"># then we would ast.parse</span>
|
|
<span class="c1"># a +</span>
|
|
<span class="c1"># b</span>
|
|
<span class="c1"># which is not a valid statement because of the newline.</span>
|
|
<span class="c1"># Adding brackets makes it a valid expression.</span>
|
|
<span class="c1"># (</span>
|
|
<span class="c1"># a +</span>
|
|
<span class="c1"># b</span>
|
|
<span class="c1"># )</span>
|
|
<span class="c1"># Line locations will be different than the original,</span>
|
|
<span class="c1"># which is taken into account later on.</span>
|
|
<span class="n">tree</span> <span class="o">=</span> <span class="n">ast</span><span class="o">.</span><span class="n">parse</span><span class="p">(</span><span class="sa">f</span><span class="s2">"(</span><span class="se">\n</span><span class="si">{</span><span class="n">segment</span><span class="si">}</span><span class="se">\n</span><span class="s2">)"</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">SyntaxError</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">1</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="n">lines</span> <span class="o">=</span> <span class="n">segment</span><span class="o">.</span><span class="n">splitlines</span><span class="p">()</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">normalize</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">offset</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Get character index given byte offset"""</span>
|
|
<span class="k">return</span> <span class="n">_byte_offset_to_character_offset</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">],</span> <span class="n">offset</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">next_valid_char</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Gets the next valid character index in `lines`, if</span>
|
|
<span class="sd"> the current location is not valid. Handles empty lines.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="k">while</span> <span class="n">lineno</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="ow">and</span> <span class="n">col</span> <span class="o">>=</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">]):</span>
|
|
<span class="n">col</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">lineno</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="k">assert</span> <span class="n">lineno</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span> <span class="ow">and</span> <span class="n">col</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">])</span>
|
|
<span class="k">return</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">col</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">increment</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Get the next valid character index in `lines`."""</span>
|
|
<span class="n">col</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">lineno</span><span class="p">,</span> <span class="n">col</span> <span class="o">=</span> <span class="n">next_valid_char</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">col</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">nextline</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Get the next valid character at least on the next line"""</span>
|
|
<span class="n">col</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="n">lineno</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">lineno</span><span class="p">,</span> <span class="n">col</span> <span class="o">=</span> <span class="n">next_valid_char</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">col</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">increment_until</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">stop</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Get the next valid non-"\\#" character that satisfies the `stop` predicate"""</span>
|
|
<span class="k">while</span> <span class="kc">True</span><span class="p">:</span>
|
|
<span class="n">ch</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">][</span><span class="n">col</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="n">ch</span> <span class="ow">in</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">#"</span><span class="p">:</span>
|
|
<span class="n">lineno</span><span class="p">,</span> <span class="n">col</span> <span class="o">=</span> <span class="n">nextline</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="ow">not</span> <span class="n">stop</span><span class="p">(</span><span class="n">ch</span><span class="p">):</span>
|
|
<span class="n">lineno</span><span class="p">,</span> <span class="n">col</span> <span class="o">=</span> <span class="n">increment</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">break</span>
|
|
<span class="k">return</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">col</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">setup_positions</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">force_valid</span><span class="o">=</span><span class="kc">True</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Get the lineno/col position of the end of `expr`. If `force_valid` is True,</span>
|
|
<span class="sd"> forces the position to be a valid character (e.g. if the position is beyond the</span>
|
|
<span class="sd"> end of the line, move to the next line)</span>
|
|
<span class="sd"> """</span>
|
|
<span class="c1"># -2 since end_lineno is 1-indexed and because we added an extra</span>
|
|
<span class="c1"># bracket + newline to `segment` when calling ast.parse</span>
|
|
<span class="n">lineno</span> <span class="o">=</span> <span class="n">expr</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">-</span> <span class="mi">2</span>
|
|
<span class="n">col</span> <span class="o">=</span> <span class="n">normalize</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">expr</span><span class="o">.</span><span class="n">end_col_offset</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">next_valid_char</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span> <span class="k">if</span> <span class="n">force_valid</span> <span class="k">else</span> <span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">)</span>
|
|
|
|
<span class="n">statement</span> <span class="o">=</span> <span class="n">tree</span><span class="o">.</span><span class="n">body</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
|
|
<span class="k">match</span> <span class="n">statement</span><span class="p">:</span>
|
|
<span class="k">case</span> <span class="n">ast</span><span class="o">.</span><span class="n">Expr</span><span class="p">(</span><span class="n">expr</span><span class="p">):</span>
|
|
<span class="k">match</span> <span class="n">expr</span><span class="p">:</span>
|
|
<span class="k">case</span> <span class="n">ast</span><span class="o">.</span><span class="n">BinOp</span><span class="p">():</span>
|
|
<span class="c1"># ast gives these locations for BinOp subexpressions</span>
|
|
<span class="c1"># ( left_expr ) + ( right_expr )</span>
|
|
<span class="c1"># left^^^^^ right^^^^^</span>
|
|
<span class="n">lineno</span><span class="p">,</span> <span class="n">col</span> <span class="o">=</span> <span class="n">setup_positions</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">left</span><span class="p">)</span>
|
|
|
|
<span class="c1"># First operator character is the first non-space/')' character</span>
|
|
<span class="n">lineno</span><span class="p">,</span> <span class="n">col</span> <span class="o">=</span> <span class="n">increment_until</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="ow">not</span> <span class="n">x</span><span class="o">.</span><span class="n">isspace</span><span class="p">()</span> <span class="ow">and</span> <span class="n">x</span> <span class="o">!=</span> <span class="s1">')'</span><span class="p">)</span>
|
|
|
|
<span class="c1"># binary op is 1 or 2 characters long, on the same line,</span>
|
|
<span class="c1"># before the right subexpression</span>
|
|
<span class="n">right_col</span> <span class="o">=</span> <span class="n">col</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="n">right_col</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">])</span>
|
|
<span class="ow">and</span> <span class="p">(</span>
|
|
<span class="c1"># operator char should not be in the right subexpression</span>
|
|
<span class="n">expr</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">lineno</span> <span class="o">-</span> <span class="mi">2</span> <span class="o">></span> <span class="n">lineno</span> <span class="ow">or</span>
|
|
<span class="n">right_col</span> <span class="o"><</span> <span class="n">normalize</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">lineno</span> <span class="o">-</span> <span class="mi">2</span><span class="p">,</span> <span class="n">expr</span><span class="o">.</span><span class="n">right</span><span class="o">.</span><span class="n">col_offset</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="ow">and</span> <span class="ow">not</span> <span class="p">(</span><span class="n">ch</span> <span class="o">:=</span> <span class="n">lines</span><span class="p">[</span><span class="n">lineno</span><span class="p">][</span><span class="n">right_col</span><span class="p">])</span><span class="o">.</span><span class="n">isspace</span><span class="p">()</span>
|
|
<span class="ow">and</span> <span class="n">ch</span> <span class="ow">not</span> <span class="ow">in</span> <span class="s2">"</span><span class="se">\\</span><span class="s2">#"</span>
|
|
<span class="p">):</span>
|
|
<span class="n">right_col</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="c1"># right_col can be invalid since it is exclusive</span>
|
|
<span class="k">return</span> <span class="n">_Anchors</span><span class="p">(</span><span class="n">lineno</span><span class="p">,</span> <span class="n">col</span><span class="p">,</span> <span class="n">lineno</span><span class="p">,</span> <span class="n">right_col</span><span class="p">)</span>
|
|
<span class="k">case</span> <span class="n">ast</span><span class="o">.</span><span class="n">Subscript</span><span class="p">():</span>
|
|
<span class="c1"># ast gives these locations for value and slice subexpressions</span>
|
|
<span class="c1"># ( value_expr ) [ slice_expr ]</span>
|
|
<span class="c1"># value^^^^^ slice^^^^^</span>
|
|
<span class="c1"># subscript^^^^^^^^^^^^^^^^^^^^</span>
|
|
|
|
<span class="c1"># find left bracket</span>
|
|
<span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span> <span class="o">=</span> <span class="n">setup_positions</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">value</span><span class="p">)</span>
|
|
<span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span> <span class="o">=</span> <span class="n">increment_until</span><span class="p">(</span><span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">==</span> <span class="s1">'['</span><span class="p">)</span>
|
|
<span class="c1"># find right bracket (final character of expression)</span>
|
|
<span class="n">right_lineno</span><span class="p">,</span> <span class="n">right_col</span> <span class="o">=</span> <span class="n">setup_positions</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">force_valid</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_Anchors</span><span class="p">(</span><span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span><span class="p">,</span> <span class="n">right_lineno</span><span class="p">,</span> <span class="n">right_col</span><span class="p">)</span>
|
|
<span class="k">case</span> <span class="n">ast</span><span class="o">.</span><span class="n">Call</span><span class="p">():</span>
|
|
<span class="c1"># ast gives these locations for function call expressions</span>
|
|
<span class="c1"># ( func_expr ) (args, kwargs)</span>
|
|
<span class="c1"># func^^^^^</span>
|
|
<span class="c1"># call^^^^^^^^^^^^^^^^^^^^^^^^</span>
|
|
|
|
<span class="c1"># find left bracket</span>
|
|
<span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span> <span class="o">=</span> <span class="n">setup_positions</span><span class="p">(</span><span class="n">expr</span><span class="o">.</span><span class="n">func</span><span class="p">)</span>
|
|
<span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span> <span class="o">=</span> <span class="n">increment_until</span><span class="p">(</span><span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span> <span class="o">==</span> <span class="s1">'('</span><span class="p">)</span>
|
|
<span class="c1"># find right bracket (final character of expression)</span>
|
|
<span class="n">right_lineno</span><span class="p">,</span> <span class="n">right_col</span> <span class="o">=</span> <span class="n">setup_positions</span><span class="p">(</span><span class="n">expr</span><span class="p">,</span> <span class="n">force_valid</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="n">_Anchors</span><span class="p">(</span><span class="n">left_lineno</span><span class="p">,</span> <span class="n">left_col</span><span class="p">,</span> <span class="n">right_lineno</span><span class="p">,</span> <span class="n">right_col</span><span class="p">)</span>
|
|
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
|
|
<span class="n">_WIDE_CHAR_SPECIFIERS</span> <span class="o">=</span> <span class="s2">"WF"</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_display_width</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">offset</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Calculate the extra amount of width space the given source</span>
|
|
<span class="sd"> code segment might take if it were to be displayed on a fixed</span>
|
|
<span class="sd"> width output device. Supports wide unicode characters and emojis."""</span>
|
|
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Fast track for ASCII-only strings</span>
|
|
<span class="k">if</span> <span class="n">line</span><span class="o">.</span><span class="n">isascii</span><span class="p">():</span>
|
|
<span class="k">return</span> <span class="n">offset</span>
|
|
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">unicodedata</span>
|
|
|
|
<span class="k">return</span> <span class="nb">sum</span><span class="p">(</span>
|
|
<span class="mi">2</span> <span class="k">if</span> <span class="n">unicodedata</span><span class="o">.</span><span class="n">east_asian_width</span><span class="p">(</span><span class="n">char</span><span class="p">)</span> <span class="ow">in</span> <span class="n">_WIDE_CHAR_SPECIFIERS</span> <span class="k">else</span> <span class="mi">1</span>
|
|
<span class="k">for</span> <span class="n">char</span> <span class="ow">in</span> <span class="n">line</span><span class="p">[:</span><span class="n">offset</span><span class="p">]</span>
|
|
<span class="p">)</span>
|
|
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">_ExceptionPrintContext</span><span class="p">:</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">seen</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">need_close</span> <span class="o">=</span> <span class="kc">False</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">indent</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="s1">' '</span> <span class="o">*</span> <span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="bp">self</span><span class="o">.</span><span class="n">exception_group_depth</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">emit</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">text_gen</span><span class="p">,</span> <span class="n">margin_char</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">margin_char</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">margin_char</span> <span class="o">=</span> <span class="s1">'|'</span>
|
|
<span class="n">indent_str</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">indent</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exception_group_depth</span><span class="p">:</span>
|
|
<span class="n">indent_str</span> <span class="o">+=</span> <span class="n">margin_char</span> <span class="o">+</span> <span class="s1">' '</span>
|
|
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text_gen</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="k">yield</span> <span class="n">textwrap</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">text_gen</span><span class="p">,</span> <span class="n">indent_str</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">line</span><span class="p">:</span> <span class="kc">True</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">text</span> <span class="ow">in</span> <span class="n">text_gen</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">textwrap</span><span class="o">.</span><span class="n">indent</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="n">indent_str</span><span class="p">,</span> <span class="k">lambda</span> <span class="n">line</span><span class="p">:</span> <span class="kc">True</span><span class="p">)</span>
|
|
|
|
|
|
<span class="k">class</span><span class="w"> </span><span class="nc">TracebackException</span><span class="p">:</span>
|
|
<span class="w"> </span><span class="sd">"""An exception ready for rendering.</span>
|
|
|
|
<span class="sd"> The traceback module captures enough attributes from the original exception</span>
|
|
<span class="sd"> to this intermediary form to ensure that no references are held, while</span>
|
|
<span class="sd"> still being able to fully print or format it.</span>
|
|
|
|
<span class="sd"> max_group_width and max_group_depth control the formatting of exception</span>
|
|
<span class="sd"> groups. The depth refers to the nesting level of the group, and the width</span>
|
|
<span class="sd"> refers to the size of a single exception group's exceptions array. The</span>
|
|
<span class="sd"> formatted output is truncated when either limit is exceeded.</span>
|
|
|
|
<span class="sd"> Use `from_exception` to create TracebackException instances from exception</span>
|
|
<span class="sd"> objects, or the constructor to create TracebackException instances from</span>
|
|
<span class="sd"> individual components.</span>
|
|
|
|
<span class="sd"> - :attr:`__cause__` A TracebackException of the original *__cause__*.</span>
|
|
<span class="sd"> - :attr:`__context__` A TracebackException of the original *__context__*.</span>
|
|
<span class="sd"> - :attr:`exceptions` For exception groups - a list of TracebackException</span>
|
|
<span class="sd"> instances for the nested *exceptions*. ``None`` for other exceptions.</span>
|
|
<span class="sd"> - :attr:`__suppress_context__` The *__suppress_context__* value from the</span>
|
|
<span class="sd"> original exception.</span>
|
|
<span class="sd"> - :attr:`stack` A `StackSummary` representing the traceback.</span>
|
|
<span class="sd"> - :attr:`exc_type` (deprecated) The class of the original traceback.</span>
|
|
<span class="sd"> - :attr:`exc_type_str` String display of exc_type</span>
|
|
<span class="sd"> - :attr:`filename` For syntax errors - the filename where the error</span>
|
|
<span class="sd"> occurred.</span>
|
|
<span class="sd"> - :attr:`lineno` For syntax errors - the linenumber where the error</span>
|
|
<span class="sd"> occurred.</span>
|
|
<span class="sd"> - :attr:`end_lineno` For syntax errors - the end linenumber where the error</span>
|
|
<span class="sd"> occurred. Can be `None` if not present.</span>
|
|
<span class="sd"> - :attr:`text` For syntax errors - the text where the error</span>
|
|
<span class="sd"> occurred.</span>
|
|
<span class="sd"> - :attr:`offset` For syntax errors - the offset into the text where the</span>
|
|
<span class="sd"> error occurred.</span>
|
|
<span class="sd"> - :attr:`end_offset` For syntax errors - the end offset into the text where</span>
|
|
<span class="sd"> the error occurred. Can be `None` if not present.</span>
|
|
<span class="sd"> - :attr:`msg` For syntax errors - the compiler error message.</span>
|
|
<span class="sd"> """</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__init__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_type</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">,</span> <span class="n">exc_traceback</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">limit</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span>
|
|
<span class="n">lookup_lines</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">capture_locals</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">compact</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span>
|
|
<span class="n">max_group_width</span><span class="o">=</span><span class="mi">15</span><span class="p">,</span> <span class="n">max_group_depth</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span> <span class="n">save_exc_type</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">_seen</span><span class="o">=</span><span class="kc">None</span><span class="p">):</span>
|
|
<span class="c1"># NB: we need to accept exc_traceback, exc_value, exc_traceback to</span>
|
|
<span class="c1"># permit backwards compat with the existing API, otherwise we</span>
|
|
<span class="c1"># need stub thunk objects just to glue it together.</span>
|
|
<span class="c1"># Handle loops in __cause__ or __context__.</span>
|
|
<span class="n">is_recursive_call</span> <span class="o">=</span> <span class="n">_seen</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">_seen</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">_seen</span> <span class="o">=</span> <span class="nb">set</span><span class="p">()</span>
|
|
<span class="n">_seen</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="nb">id</span><span class="p">(</span><span class="n">exc_value</span><span class="p">))</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">max_group_width</span> <span class="o">=</span> <span class="n">max_group_width</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">max_group_depth</span> <span class="o">=</span> <span class="n">max_group_depth</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">stack</span> <span class="o">=</span> <span class="n">StackSummary</span><span class="o">.</span><span class="n">_extract_from_extended_frame_gen</span><span class="p">(</span>
|
|
<span class="n">_walk_tb_with_full_positions</span><span class="p">(</span><span class="n">exc_traceback</span><span class="p">),</span>
|
|
<span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span> <span class="n">lookup_lines</span><span class="o">=</span><span class="n">lookup_lines</span><span class="p">,</span>
|
|
<span class="n">capture_locals</span><span class="o">=</span><span class="n">capture_locals</span><span class="p">)</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_exc_type</span> <span class="o">=</span> <span class="n">exc_type</span> <span class="k">if</span> <span class="n">save_exc_type</span> <span class="k">else</span> <span class="kc">None</span>
|
|
|
|
<span class="c1"># Capture now to permit freeing resources: only complication is in the</span>
|
|
<span class="c1"># unofficial API _format_final_exc_line</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_str</span> <span class="o">=</span> <span class="n">_safe_string</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s1">'exception'</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s1">'__notes__'</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span> <span class="o">=</span> <span class="p">[</span>
|
|
<span class="sa">f</span><span class="s1">'Ignored error getting __notes__: </span><span class="si">{</span><span class="n">_safe_string</span><span class="p">(</span><span class="n">e</span><span class="p">,</span><span class="w"> </span><span class="s1">'__notes__'</span><span class="p">,</span><span class="w"> </span><span class="nb">repr</span><span class="p">)</span><span class="si">}</span><span class="s1">'</span><span class="p">]</span>
|
|
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_is_syntax_error</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_have_exc_type</span> <span class="o">=</span> <span class="n">exc_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="n">exc_type</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">exc_type_qualname</span> <span class="o">=</span> <span class="n">exc_type</span><span class="o">.</span><span class="vm">__qualname__</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">exc_type_module</span> <span class="o">=</span> <span class="n">exc_type</span><span class="o">.</span><span class="vm">__module__</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">exc_type_qualname</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">exc_type_module</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">if</span> <span class="n">exc_type</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="ne">SyntaxError</span><span class="p">):</span>
|
|
<span class="c1"># Handle SyntaxError's specially</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">filename</span>
|
|
<span class="n">lno</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">lineno</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">lno</span><span class="p">)</span> <span class="k">if</span> <span class="n">lno</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="n">end_lno</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">end_lineno</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">end_lineno</span> <span class="o">=</span> <span class="nb">str</span><span class="p">(</span><span class="n">end_lno</span><span class="p">)</span> <span class="k">if</span> <span class="n">end_lno</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">None</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">text</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">offset</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">end_offset</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">end_offset</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">msg</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_is_syntax_error</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">elif</span> <span class="n">exc_type</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="ne">ImportError</span><span class="p">)</span> <span class="ow">and</span> \
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s2">"name_from"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">wrong_name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s2">"name_from"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">suggestion</span> <span class="o">=</span> <span class="n">_compute_suggestion_error</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="n">exc_traceback</span><span class="p">,</span> <span class="n">wrong_name</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">suggestion</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">". Did you mean: '</span><span class="si">{</span><span class="n">suggestion</span><span class="si">}</span><span class="s2">'?"</span>
|
|
<span class="k">elif</span> <span class="n">exc_type</span> <span class="ow">and</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="p">(</span><span class="ne">NameError</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">))</span> <span class="ow">and</span> \
|
|
<span class="nb">getattr</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s2">"name"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">wrong_name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s2">"name"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="n">suggestion</span> <span class="o">=</span> <span class="n">_compute_suggestion_error</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="n">exc_traceback</span><span class="p">,</span> <span class="n">wrong_name</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">suggestion</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">". Did you mean: '</span><span class="si">{</span><span class="n">suggestion</span><span class="si">}</span><span class="s2">'?"</span>
|
|
<span class="k">if</span> <span class="nb">issubclass</span><span class="p">(</span><span class="n">exc_type</span><span class="p">,</span> <span class="ne">NameError</span><span class="p">):</span>
|
|
<span class="n">wrong_name</span> <span class="o">=</span> <span class="nb">getattr</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="s2">"name"</span><span class="p">,</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">wrong_name</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">wrong_name</span> <span class="ow">in</span> <span class="n">sys</span><span class="o">.</span><span class="n">stdlib_module_names</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">suggestion</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">" Or did you forget to import '</span><span class="si">{</span><span class="n">wrong_name</span><span class="si">}</span><span class="s2">'?"</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_str</span> <span class="o">+=</span> <span class="sa">f</span><span class="s2">". Did you forget to import '</span><span class="si">{</span><span class="n">wrong_name</span><span class="si">}</span><span class="s2">'?"</span>
|
|
<span class="k">if</span> <span class="n">lookup_lines</span><span class="p">:</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">_load_lines</span><span class="p">()</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">__suppress_context__</span> <span class="o">=</span> \
|
|
<span class="n">exc_value</span><span class="o">.</span><span class="n">__suppress_context__</span> <span class="k">if</span> <span class="n">exc_value</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="k">else</span> <span class="kc">False</span>
|
|
|
|
<span class="c1"># Convert __cause__ and __context__ to `TracebackExceptions`s, use a</span>
|
|
<span class="c1"># queue to avoid recursion (only the top-level call gets _seen == None)</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">is_recursive_call</span><span class="p">:</span>
|
|
<span class="n">queue</span> <span class="o">=</span> <span class="p">[(</span><span class="bp">self</span><span class="p">,</span> <span class="n">exc_value</span><span class="p">)]</span>
|
|
<span class="k">while</span> <span class="n">queue</span><span class="p">:</span>
|
|
<span class="n">te</span><span class="p">,</span> <span class="n">e</span> <span class="o">=</span> <span class="n">queue</span><span class="o">.</span><span class="n">pop</span><span class="p">()</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">e</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">__cause__</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="ow">and</span> <span class="nb">id</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">__cause__</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_seen</span><span class="p">):</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="n">TracebackException</span><span class="p">(</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">__cause__</span><span class="p">),</span>
|
|
<span class="n">e</span><span class="o">.</span><span class="n">__cause__</span><span class="p">,</span>
|
|
<span class="n">e</span><span class="o">.</span><span class="n">__cause__</span><span class="o">.</span><span class="n">__traceback__</span><span class="p">,</span>
|
|
<span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span>
|
|
<span class="n">lookup_lines</span><span class="o">=</span><span class="n">lookup_lines</span><span class="p">,</span>
|
|
<span class="n">capture_locals</span><span class="o">=</span><span class="n">capture_locals</span><span class="p">,</span>
|
|
<span class="n">max_group_width</span><span class="o">=</span><span class="n">max_group_width</span><span class="p">,</span>
|
|
<span class="n">max_group_depth</span><span class="o">=</span><span class="n">max_group_depth</span><span class="p">,</span>
|
|
<span class="n">_seen</span><span class="o">=</span><span class="n">_seen</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">cause</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">if</span> <span class="n">compact</span><span class="p">:</span>
|
|
<span class="n">need_context</span> <span class="o">=</span> <span class="p">(</span><span class="n">cause</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="n">e</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="ow">not</span> <span class="n">e</span><span class="o">.</span><span class="n">__suppress_context__</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">need_context</span> <span class="o">=</span> <span class="kc">True</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="n">e</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="n">e</span><span class="o">.</span><span class="n">__context__</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span>
|
|
<span class="ow">and</span> <span class="n">need_context</span> <span class="ow">and</span> <span class="nb">id</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">__context__</span><span class="p">)</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">_seen</span><span class="p">):</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="n">TracebackException</span><span class="p">(</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">e</span><span class="o">.</span><span class="n">__context__</span><span class="p">),</span>
|
|
<span class="n">e</span><span class="o">.</span><span class="n">__context__</span><span class="p">,</span>
|
|
<span class="n">e</span><span class="o">.</span><span class="n">__context__</span><span class="o">.</span><span class="n">__traceback__</span><span class="p">,</span>
|
|
<span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span>
|
|
<span class="n">lookup_lines</span><span class="o">=</span><span class="n">lookup_lines</span><span class="p">,</span>
|
|
<span class="n">capture_locals</span><span class="o">=</span><span class="n">capture_locals</span><span class="p">,</span>
|
|
<span class="n">max_group_width</span><span class="o">=</span><span class="n">max_group_width</span><span class="p">,</span>
|
|
<span class="n">max_group_depth</span><span class="o">=</span><span class="n">max_group_depth</span><span class="p">,</span>
|
|
<span class="n">_seen</span><span class="o">=</span><span class="n">_seen</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">context</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="k">if</span> <span class="n">e</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">e</span><span class="p">,</span> <span class="n">BaseExceptionGroup</span><span class="p">):</span>
|
|
<span class="n">exceptions</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="k">for</span> <span class="n">exc</span> <span class="ow">in</span> <span class="n">e</span><span class="o">.</span><span class="n">exceptions</span><span class="p">:</span>
|
|
<span class="n">texc</span> <span class="o">=</span> <span class="n">TracebackException</span><span class="p">(</span>
|
|
<span class="nb">type</span><span class="p">(</span><span class="n">exc</span><span class="p">),</span>
|
|
<span class="n">exc</span><span class="p">,</span>
|
|
<span class="n">exc</span><span class="o">.</span><span class="n">__traceback__</span><span class="p">,</span>
|
|
<span class="n">limit</span><span class="o">=</span><span class="n">limit</span><span class="p">,</span>
|
|
<span class="n">lookup_lines</span><span class="o">=</span><span class="n">lookup_lines</span><span class="p">,</span>
|
|
<span class="n">capture_locals</span><span class="o">=</span><span class="n">capture_locals</span><span class="p">,</span>
|
|
<span class="n">max_group_width</span><span class="o">=</span><span class="n">max_group_width</span><span class="p">,</span>
|
|
<span class="n">max_group_depth</span><span class="o">=</span><span class="n">max_group_depth</span><span class="p">,</span>
|
|
<span class="n">_seen</span><span class="o">=</span><span class="n">_seen</span><span class="p">)</span>
|
|
<span class="n">exceptions</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">texc</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">exceptions</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="n">te</span><span class="o">.</span><span class="n">__cause__</span> <span class="o">=</span> <span class="n">cause</span>
|
|
<span class="n">te</span><span class="o">.</span><span class="n">__context__</span> <span class="o">=</span> <span class="n">context</span>
|
|
<span class="n">te</span><span class="o">.</span><span class="n">exceptions</span> <span class="o">=</span> <span class="n">exceptions</span>
|
|
<span class="k">if</span> <span class="n">cause</span><span class="p">:</span>
|
|
<span class="n">queue</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">te</span><span class="o">.</span><span class="n">__cause__</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">__cause__</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">context</span><span class="p">:</span>
|
|
<span class="n">queue</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">te</span><span class="o">.</span><span class="n">__context__</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">__context__</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="n">exceptions</span><span class="p">:</span>
|
|
<span class="n">queue</span><span class="o">.</span><span class="n">extend</span><span class="p">(</span><span class="nb">zip</span><span class="p">(</span><span class="n">te</span><span class="o">.</span><span class="n">exceptions</span><span class="p">,</span> <span class="n">e</span><span class="o">.</span><span class="n">exceptions</span><span class="p">))</span>
|
|
|
|
<span class="nd">@classmethod</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">from_exception</span><span class="p">(</span><span class="bp">cls</span><span class="p">,</span> <span class="n">exc</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Create a TracebackException from an exception."""</span>
|
|
<span class="k">return</span> <span class="bp">cls</span><span class="p">(</span><span class="nb">type</span><span class="p">(</span><span class="n">exc</span><span class="p">),</span> <span class="n">exc</span><span class="p">,</span> <span class="n">exc</span><span class="o">.</span><span class="n">__traceback__</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">exc_type</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="n">warnings</span><span class="o">.</span><span class="n">warn</span><span class="p">(</span><span class="s1">'Deprecated in 3.13. Use exc_type_str instead.'</span><span class="p">,</span>
|
|
<span class="ne">DeprecationWarning</span><span class="p">,</span> <span class="n">stacklevel</span><span class="o">=</span><span class="mi">2</span><span class="p">)</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_exc_type</span>
|
|
|
|
<span class="nd">@property</span>
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">exc_type_str</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_have_exc_type</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="n">stype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_type_qualname</span>
|
|
<span class="n">smod</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_type_module</span>
|
|
<span class="k">if</span> <span class="n">smod</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">(</span><span class="s2">"__main__"</span><span class="p">,</span> <span class="s2">"builtins"</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">smod</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="n">smod</span> <span class="o">=</span> <span class="s2">"<unknown>"</span>
|
|
<span class="n">stype</span> <span class="o">=</span> <span class="n">smod</span> <span class="o">+</span> <span class="s1">'.'</span> <span class="o">+</span> <span class="n">stype</span>
|
|
<span class="k">return</span> <span class="n">stype</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_load_lines</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Private API. force all lines in the stack to be loaded."""</span>
|
|
<span class="k">for</span> <span class="n">frame</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">stack</span><span class="p">:</span>
|
|
<span class="n">frame</span><span class="o">.</span><span class="n">line</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__eq__</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">other</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">other</span><span class="p">,</span> <span class="n">TracebackException</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="vm">__dict__</span> <span class="o">==</span> <span class="n">other</span><span class="o">.</span><span class="vm">__dict__</span>
|
|
<span class="k">return</span> <span class="bp">NotImplemented</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="fm">__str__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format_exception_only</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">show_group</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">_depth</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format the exception part of the traceback.</span>
|
|
|
|
<span class="sd"> The return value is a generator of strings, each ending in a newline.</span>
|
|
|
|
<span class="sd"> Generator yields the exception message.</span>
|
|
<span class="sd"> For :exc:`SyntaxError` exceptions, it</span>
|
|
<span class="sd"> also yields (before the exception message)</span>
|
|
<span class="sd"> several lines that (when printed)</span>
|
|
<span class="sd"> display detailed information about where the syntax error occurred.</span>
|
|
<span class="sd"> Following the message, generator also yields</span>
|
|
<span class="sd"> all the exception's ``__notes__``.</span>
|
|
|
|
<span class="sd"> When *show_group* is ``True``, and the exception is an instance of</span>
|
|
<span class="sd"> :exc:`BaseExceptionGroup`, the nested exceptions are included as</span>
|
|
<span class="sd"> well, recursively, with indentation relative to their nesting depth.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
|
|
<span class="n">indent</span> <span class="o">=</span> <span class="mi">3</span> <span class="o">*</span> <span class="n">_depth</span> <span class="o">*</span> <span class="s1">' '</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_have_exc_type</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">indent</span> <span class="o">+</span> <span class="n">_format_final_exc_line</span><span class="p">(</span><span class="kc">None</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
<span class="k">return</span>
|
|
|
|
<span class="n">stype</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">exc_type_str</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="bp">self</span><span class="o">.</span><span class="n">_is_syntax_error</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">_depth</span> <span class="o">></span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># Nested exceptions needs correct handling of multiline messages.</span>
|
|
<span class="n">formatted</span> <span class="o">=</span> <span class="n">_format_final_exc_line</span><span class="p">(</span>
|
|
<span class="n">stype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span><span class="p">,</span> <span class="n">insert_final_newline</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span>
|
|
<span class="p">)</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">yield from</span> <span class="p">[</span>
|
|
<span class="n">indent</span> <span class="o">+</span> <span class="n">l</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span>
|
|
<span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">formatted</span>
|
|
<span class="p">]</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">_format_final_exc_line</span><span class="p">(</span><span class="n">stype</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">_str</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">yield from</span> <span class="p">[</span><span class="n">indent</span> <span class="o">+</span> <span class="n">l</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">_format_syntax_error</span><span class="p">(</span><span class="n">stype</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)]</span>
|
|
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span><span class="p">,</span> <span class="n">collections</span><span class="o">.</span><span class="n">abc</span><span class="o">.</span><span class="n">Sequence</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span><span class="p">,</span> <span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="nb">bytes</span><span class="p">))</span>
|
|
<span class="p">):</span>
|
|
<span class="k">for</span> <span class="n">note</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span><span class="p">:</span>
|
|
<span class="n">note</span> <span class="o">=</span> <span class="n">_safe_string</span><span class="p">(</span><span class="n">note</span><span class="p">,</span> <span class="s1">'note'</span><span class="p">)</span>
|
|
<span class="k">yield from</span> <span class="p">[</span><span class="n">indent</span> <span class="o">+</span> <span class="n">l</span> <span class="o">+</span> <span class="s1">'</span><span class="se">\n</span><span class="s1">'</span> <span class="k">for</span> <span class="n">l</span> <span class="ow">in</span> <span class="n">note</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)]</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="n">indent</span> <span class="o">+</span> <span class="s2">"</span><span class="si">{}</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">_safe_string</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">__notes__</span><span class="p">,</span> <span class="s1">'__notes__'</span><span class="p">,</span> <span class="n">func</span><span class="o">=</span><span class="nb">repr</span><span class="p">))</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">exceptions</span> <span class="ow">and</span> <span class="n">show_group</span><span class="p">:</span>
|
|
<span class="k">for</span> <span class="n">ex</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">exceptions</span><span class="p">:</span>
|
|
<span class="k">yield from</span> <span class="n">ex</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">show_group</span><span class="o">=</span><span class="n">show_group</span><span class="p">,</span> <span class="n">_depth</span><span class="o">=</span><span class="n">_depth</span><span class="o">+</span><span class="mi">1</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_format_syntax_error</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">stype</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format SyntaxError exceptions (internal helper)."""</span>
|
|
<span class="c1"># Show exactly where the problem was found.</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="n">filename_suffix</span> <span class="o">=</span> <span class="s1">''</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">colorize</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="s1">' File </span><span class="si">{}</span><span class="s1">"</span><span class="si">{}</span><span class="s1">"</span><span class="si">{}</span><span class="s1">, line </span><span class="si">{}{}{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="ow">or</span> <span class="s2">"<string>"</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">,</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="s1">' File "</span><span class="si">{}</span><span class="s1">", line </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="ow">or</span> <span class="s2">"<string>"</span><span class="p">,</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="bp">self</span><span class="o">.</span><span class="n">filename</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">filename_suffix</span> <span class="o">=</span> <span class="s1">' (</span><span class="si">{}</span><span class="s1">)'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">filename</span><span class="p">)</span>
|
|
|
|
<span class="n">text</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">text</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">text</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="c1"># text = " foo\n"</span>
|
|
<span class="c1"># rtext = " foo"</span>
|
|
<span class="c1"># ltext = "foo"</span>
|
|
<span class="n">rtext</span> <span class="o">=</span> <span class="n">text</span><span class="o">.</span><span class="n">rstrip</span><span class="p">(</span><span class="s1">'</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">ltext</span> <span class="o">=</span> <span class="n">rtext</span><span class="o">.</span><span class="n">lstrip</span><span class="p">(</span><span class="s1">' </span><span class="se">\n\f</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">spaces</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">rtext</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">ltext</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="s1">' </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ltext</span><span class="p">)</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">offset</span><span class="p">,</span> <span class="nb">int</span><span class="p">):</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">offset</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">lineno</span> <span class="o">==</span> <span class="bp">self</span><span class="o">.</span><span class="n">end_lineno</span><span class="p">:</span>
|
|
<span class="n">end_offset</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="bp">self</span><span class="o">.</span><span class="n">end_offset</span>
|
|
<span class="k">if</span> <span class="p">(</span>
|
|
<span class="nb">isinstance</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">end_offset</span><span class="p">,</span> <span class="nb">int</span><span class="p">)</span>
|
|
<span class="ow">and</span> <span class="bp">self</span><span class="o">.</span><span class="n">end_offset</span> <span class="o">!=</span> <span class="mi">0</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span> <span class="n">offset</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">end_offset</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">rtext</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="ow">and</span> <span class="n">offset</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">):</span>
|
|
<span class="n">offset</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">rtext</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">text</span> <span class="ow">and</span> <span class="n">end_offset</span> <span class="o">></span> <span class="nb">len</span><span class="p">(</span><span class="bp">self</span><span class="o">.</span><span class="n">text</span><span class="p">):</span>
|
|
<span class="n">end_offset</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">rtext</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="n">offset</span> <span class="o">>=</span> <span class="n">end_offset</span> <span class="ow">or</span> <span class="n">end_offset</span> <span class="o"><</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="n">end_offset</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
<span class="c1"># Convert 1-based column offset to 0-based index into stripped text</span>
|
|
<span class="n">colno</span> <span class="o">=</span> <span class="n">offset</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">spaces</span>
|
|
<span class="n">end_colno</span> <span class="o">=</span> <span class="n">end_offset</span> <span class="o">-</span> <span class="mi">1</span> <span class="o">-</span> <span class="n">spaces</span>
|
|
<span class="n">caretspace</span> <span class="o">=</span> <span class="s1">' '</span>
|
|
<span class="k">if</span> <span class="n">colno</span> <span class="o">>=</span> <span class="mi">0</span><span class="p">:</span>
|
|
<span class="c1"># non-space whitespace (likes tabs) must be kept for alignment</span>
|
|
<span class="n">caretspace</span> <span class="o">=</span> <span class="p">((</span><span class="n">c</span> <span class="k">if</span> <span class="n">c</span><span class="o">.</span><span class="n">isspace</span><span class="p">()</span> <span class="k">else</span> <span class="s1">' '</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">ltext</span><span class="p">[:</span><span class="n">colno</span><span class="p">])</span>
|
|
<span class="n">start_color</span> <span class="o">=</span> <span class="n">end_color</span> <span class="o">=</span> <span class="s2">""</span>
|
|
<span class="k">if</span> <span class="n">colorize</span><span class="p">:</span>
|
|
<span class="c1"># colorize from colno to end_colno</span>
|
|
<span class="n">ltext</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="n">ltext</span><span class="p">[:</span><span class="n">colno</span><span class="p">]</span> <span class="o">+</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_RED</span> <span class="o">+</span> <span class="n">ltext</span><span class="p">[</span><span class="n">colno</span><span class="p">:</span><span class="n">end_colno</span><span class="p">]</span> <span class="o">+</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span> <span class="o">+</span>
|
|
<span class="n">ltext</span><span class="p">[</span><span class="n">end_colno</span><span class="p">:]</span>
|
|
<span class="p">)</span>
|
|
<span class="n">start_color</span> <span class="o">=</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_RED</span>
|
|
<span class="n">end_color</span> <span class="o">=</span> <span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span>
|
|
<span class="k">yield</span> <span class="s1">' </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ltext</span><span class="p">)</span>
|
|
<span class="k">yield</span> <span class="s1">' </span><span class="si">{}{}{}{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="s2">""</span><span class="o">.</span><span class="n">join</span><span class="p">(</span><span class="n">caretspace</span><span class="p">),</span>
|
|
<span class="n">start_color</span><span class="p">,</span>
|
|
<span class="p">(</span><span class="s1">'^'</span> <span class="o">*</span> <span class="p">(</span><span class="n">end_colno</span> <span class="o">-</span> <span class="n">colno</span><span class="p">)),</span>
|
|
<span class="n">end_color</span><span class="p">,</span>
|
|
<span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="s1">' </span><span class="si">{}</span><span class="se">\n</span><span class="s1">'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">ltext</span><span class="p">)</span>
|
|
<span class="n">msg</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">msg</span> <span class="ow">or</span> <span class="s2">"<no detail available>"</span>
|
|
<span class="k">if</span> <span class="n">colorize</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="s2">"</span><span class="si">{}{}{}</span><span class="s2">: </span><span class="si">{}{}{}{}</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">BOLD_MAGENTA</span><span class="p">,</span>
|
|
<span class="n">stype</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">MAGENTA</span><span class="p">,</span>
|
|
<span class="n">msg</span><span class="p">,</span>
|
|
<span class="n">ANSIColors</span><span class="o">.</span><span class="n">RESET</span><span class="p">,</span>
|
|
<span class="n">filename_suffix</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="s2">"</span><span class="si">{}</span><span class="s2">: </span><span class="si">{}{}</span><span class="se">\n</span><span class="s2">"</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">stype</span><span class="p">,</span> <span class="n">msg</span><span class="p">,</span> <span class="n">filename_suffix</span><span class="p">)</span>
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">format</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="n">_ctx</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Format the exception.</span>
|
|
|
|
<span class="sd"> If chain is not *True*, *__cause__* and *__context__* will not be formatted.</span>
|
|
|
|
<span class="sd"> The return value is a generator of strings, each ending in a newline and</span>
|
|
<span class="sd"> some containing internal newlines. `print_exception` is a wrapper around</span>
|
|
<span class="sd"> this method which just prints the lines to a file.</span>
|
|
|
|
<span class="sd"> The message indicating which exception occurred is always the last</span>
|
|
<span class="sd"> string in the output.</span>
|
|
<span class="sd"> """</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">_ctx</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">_ctx</span> <span class="o">=</span> <span class="n">_ExceptionPrintContext</span><span class="p">()</span>
|
|
|
|
<span class="n">output</span> <span class="o">=</span> <span class="p">[]</span>
|
|
<span class="n">exc</span> <span class="o">=</span> <span class="bp">self</span>
|
|
<span class="k">if</span> <span class="n">chain</span><span class="p">:</span>
|
|
<span class="k">while</span> <span class="n">exc</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">__cause__</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">chained_msg</span> <span class="o">=</span> <span class="n">_cause_message</span>
|
|
<span class="n">chained_exc</span> <span class="o">=</span> <span class="n">exc</span><span class="o">.</span><span class="n">__cause__</span>
|
|
<span class="k">elif</span> <span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">__context__</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span> <span class="ow">and</span>
|
|
<span class="ow">not</span> <span class="n">exc</span><span class="o">.</span><span class="n">__suppress_context__</span><span class="p">):</span>
|
|
<span class="n">chained_msg</span> <span class="o">=</span> <span class="n">_context_message</span>
|
|
<span class="n">chained_exc</span> <span class="o">=</span> <span class="n">exc</span><span class="o">.</span><span class="n">__context__</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">chained_msg</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="n">chained_exc</span> <span class="o">=</span> <span class="kc">None</span>
|
|
|
|
<span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="n">chained_msg</span><span class="p">,</span> <span class="n">exc</span><span class="p">))</span>
|
|
<span class="n">exc</span> <span class="o">=</span> <span class="n">chained_exc</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">output</span><span class="o">.</span><span class="n">append</span><span class="p">((</span><span class="kc">None</span><span class="p">,</span> <span class="n">exc</span><span class="p">))</span>
|
|
|
|
<span class="k">for</span> <span class="n">msg</span><span class="p">,</span> <span class="n">exc</span> <span class="ow">in</span> <span class="nb">reversed</span><span class="p">(</span><span class="n">output</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">msg</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">msg</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">exceptions</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">stack</span><span class="p">:</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="s1">'Traceback (most recent call last):</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">))</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">))</span>
|
|
<span class="k">elif</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">></span> <span class="bp">self</span><span class="o">.</span><span class="n">max_group_depth</span><span class="p">:</span>
|
|
<span class="c1"># exception group, but depth exceeds limit</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"... (max_group_depth is </span><span class="si">{</span><span class="bp">self</span><span class="o">.</span><span class="n">max_group_depth</span><span class="si">}</span><span class="s2">)</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="c1"># format exception group</span>
|
|
<span class="n">is_toplevel</span> <span class="o">=</span> <span class="p">(</span><span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">is_toplevel</span><span class="p">:</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">if</span> <span class="n">exc</span><span class="o">.</span><span class="n">stack</span><span class="p">:</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span>
|
|
<span class="s1">'Exception Group Traceback (most recent call last):</span><span class="se">\n</span><span class="s1">'</span><span class="p">,</span>
|
|
<span class="n">margin_char</span> <span class="o">=</span> <span class="s1">'+'</span> <span class="k">if</span> <span class="n">is_toplevel</span> <span class="k">else</span> <span class="kc">None</span><span class="p">)</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">stack</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">))</span>
|
|
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">format_exception_only</span><span class="p">(</span><span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">))</span>
|
|
<span class="n">num_excs</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">exc</span><span class="o">.</span><span class="n">exceptions</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">num_excs</span> <span class="o"><=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_group_width</span><span class="p">:</span>
|
|
<span class="n">n</span> <span class="o">=</span> <span class="n">num_excs</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">n</span> <span class="o">=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_group_width</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">need_close</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="n">n</span><span class="p">):</span>
|
|
<span class="n">last_exc</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">==</span> <span class="n">n</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">last_exc</span><span class="p">:</span>
|
|
<span class="c1"># The closing frame may be added by a recursive call</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">need_close</span> <span class="o">=</span> <span class="kc">True</span>
|
|
|
|
<span class="k">if</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_group_width</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">truncated</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span> <span class="o">>=</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_group_width</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">truncated</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">title</span> <span class="o">=</span> <span class="sa">f</span><span class="s1">'</span><span class="si">{</span><span class="n">i</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s1">'</span> <span class="k">if</span> <span class="ow">not</span> <span class="n">truncated</span> <span class="k">else</span> <span class="s1">'...'</span>
|
|
<span class="k">yield</span> <span class="p">(</span><span class="n">_ctx</span><span class="o">.</span><span class="n">indent</span><span class="p">()</span> <span class="o">+</span>
|
|
<span class="p">(</span><span class="s1">'+-'</span> <span class="k">if</span> <span class="n">i</span><span class="o">==</span><span class="mi">0</span> <span class="k">else</span> <span class="s1">' '</span><span class="p">)</span> <span class="o">+</span>
|
|
<span class="sa">f</span><span class="s1">'+---------------- </span><span class="si">{</span><span class="n">title</span><span class="si">}</span><span class="s1"> ----------------</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">truncated</span><span class="p">:</span>
|
|
<span class="k">yield from</span> <span class="n">exc</span><span class="o">.</span><span class="n">exceptions</span><span class="p">[</span><span class="n">i</span><span class="p">]</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">,</span> <span class="n">_ctx</span><span class="o">=</span><span class="n">_ctx</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">)</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="n">remaining</span> <span class="o">=</span> <span class="n">num_excs</span> <span class="o">-</span> <span class="bp">self</span><span class="o">.</span><span class="n">max_group_width</span>
|
|
<span class="n">plural</span> <span class="o">=</span> <span class="s1">'s'</span> <span class="k">if</span> <span class="n">remaining</span> <span class="o">></span> <span class="mi">1</span> <span class="k">else</span> <span class="s1">''</span>
|
|
<span class="k">yield from</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">emit</span><span class="p">(</span>
|
|
<span class="sa">f</span><span class="s2">"and </span><span class="si">{</span><span class="n">remaining</span><span class="si">}</span><span class="s2"> more exception</span><span class="si">{</span><span class="n">plural</span><span class="si">}</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
|
|
<span class="k">if</span> <span class="n">last_exc</span> <span class="ow">and</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">need_close</span><span class="p">:</span>
|
|
<span class="k">yield</span> <span class="p">(</span><span class="n">_ctx</span><span class="o">.</span><span class="n">indent</span><span class="p">()</span> <span class="o">+</span>
|
|
<span class="s2">"+------------------------------------</span><span class="se">\n</span><span class="s2">"</span><span class="p">)</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">need_close</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">-=</span> <span class="mi">1</span>
|
|
|
|
<span class="k">if</span> <span class="n">is_toplevel</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">==</span> <span class="mi">1</span>
|
|
<span class="n">_ctx</span><span class="o">.</span><span class="n">exception_group_depth</span> <span class="o">=</span> <span class="mi">0</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">print</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="o">*</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="kc">None</span><span class="p">,</span> <span class="n">chain</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
|
|
<span class="w"> </span><span class="sd">"""Print the result of self.format(chain=chain) to 'file'."""</span>
|
|
<span class="n">colorize</span> <span class="o">=</span> <span class="n">kwargs</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s2">"colorize"</span><span class="p">,</span> <span class="kc">False</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">file</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">file</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">stderr</span>
|
|
<span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="bp">self</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="n">chain</span><span class="o">=</span><span class="n">chain</span><span class="p">,</span> <span class="n">colorize</span><span class="o">=</span><span class="n">colorize</span><span class="p">):</span>
|
|
<span class="nb">print</span><span class="p">(</span><span class="n">line</span><span class="p">,</span> <span class="n">file</span><span class="o">=</span><span class="n">file</span><span class="p">,</span> <span class="n">end</span><span class="o">=</span><span class="s2">""</span><span class="p">)</span>
|
|
|
|
|
|
<span class="n">_MAX_CANDIDATE_ITEMS</span> <span class="o">=</span> <span class="mi">750</span>
|
|
<span class="n">_MAX_STRING_SIZE</span> <span class="o">=</span> <span class="mi">40</span>
|
|
<span class="n">_MOVE_COST</span> <span class="o">=</span> <span class="mi">2</span>
|
|
<span class="n">_CASE_COST</span> <span class="o">=</span> <span class="mi">1</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_substitution_cost</span><span class="p">(</span><span class="n">ch_a</span><span class="p">,</span> <span class="n">ch_b</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">ch_a</span> <span class="o">==</span> <span class="n">ch_b</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
<span class="k">if</span> <span class="n">ch_a</span><span class="o">.</span><span class="n">lower</span><span class="p">()</span> <span class="o">==</span> <span class="n">ch_b</span><span class="o">.</span><span class="n">lower</span><span class="p">():</span>
|
|
<span class="k">return</span> <span class="n">_CASE_COST</span>
|
|
<span class="k">return</span> <span class="n">_MOVE_COST</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_compute_suggestion_error</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="n">tb</span><span class="p">,</span> <span class="n">wrong_name</span><span class="p">):</span>
|
|
<span class="k">if</span> <span class="n">wrong_name</span> <span class="ow">is</span> <span class="kc">None</span> <span class="ow">or</span> <span class="ow">not</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">wrong_name</span><span class="p">,</span> <span class="nb">str</span><span class="p">):</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="ne">AttributeError</span><span class="p">):</span>
|
|
<span class="n">obj</span> <span class="o">=</span> <span class="n">exc_value</span><span class="o">.</span><span class="n">obj</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="nb">dir</span><span class="p">(</span><span class="n">obj</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span> <span class="c1"># Attributes are unsortable, e.g. int and str</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="vm">__class__</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span> <span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">obj</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">d</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">)])</span>
|
|
<span class="n">hide_underscored</span> <span class="o">=</span> <span class="p">(</span><span class="n">wrong_name</span><span class="p">[:</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'_'</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">hide_underscored</span> <span class="ow">and</span> <span class="n">tb</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">while</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">tb</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span>
|
|
<span class="n">frame</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span>
|
|
<span class="k">if</span> <span class="s1">'self'</span> <span class="ow">in</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span> <span class="ow">and</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span><span class="p">[</span><span class="s1">'self'</span><span class="p">]</span> <span class="ow">is</span> <span class="n">obj</span><span class="p">:</span>
|
|
<span class="n">hide_underscored</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">hide_underscored</span><span class="p">:</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">d</span> <span class="k">if</span> <span class="n">x</span><span class="p">[:</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'_'</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">elif</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="ne">ImportError</span><span class="p">):</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">mod</span> <span class="o">=</span> <span class="nb">__import__</span><span class="p">(</span><span class="n">exc_value</span><span class="o">.</span><span class="n">name</span><span class="p">)</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="nb">dir</span><span class="p">(</span><span class="n">mod</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span> <span class="c1"># Attributes are unsortable, e.g. int and str</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="n">mod</span><span class="o">.</span><span class="vm">__dict__</span><span class="o">.</span><span class="n">keys</span><span class="p">())</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="nb">sorted</span><span class="p">([</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">d</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">)])</span>
|
|
<span class="k">if</span> <span class="n">wrong_name</span><span class="p">[:</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'_'</span><span class="p">:</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">d</span> <span class="k">if</span> <span class="n">x</span><span class="p">[:</span><span class="mi">1</span><span class="p">]</span> <span class="o">!=</span> <span class="s1">'_'</span><span class="p">]</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">assert</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">exc_value</span><span class="p">,</span> <span class="ne">NameError</span><span class="p">)</span>
|
|
<span class="c1"># find most recent frame</span>
|
|
<span class="k">if</span> <span class="n">tb</span> <span class="ow">is</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="k">while</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span> <span class="ow">is</span> <span class="ow">not</span> <span class="kc">None</span><span class="p">:</span>
|
|
<span class="n">tb</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_next</span>
|
|
<span class="n">frame</span> <span class="o">=</span> <span class="n">tb</span><span class="o">.</span><span class="n">tb_frame</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="p">(</span>
|
|
<span class="nb">list</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span><span class="p">)</span>
|
|
<span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">f_globals</span><span class="p">)</span>
|
|
<span class="o">+</span> <span class="nb">list</span><span class="p">(</span><span class="n">frame</span><span class="o">.</span><span class="n">f_builtins</span><span class="p">)</span>
|
|
<span class="p">)</span>
|
|
<span class="n">d</span> <span class="o">=</span> <span class="p">[</span><span class="n">x</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">d</span> <span class="k">if</span> <span class="nb">isinstance</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="nb">str</span><span class="p">)]</span>
|
|
|
|
<span class="c1"># Check first if we are in a method and the instance</span>
|
|
<span class="c1"># has the wrong name as attribute</span>
|
|
<span class="k">if</span> <span class="s1">'self'</span> <span class="ow">in</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span><span class="p">:</span>
|
|
<span class="bp">self</span> <span class="o">=</span> <span class="n">frame</span><span class="o">.</span><span class="n">f_locals</span><span class="p">[</span><span class="s1">'self'</span><span class="p">]</span>
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="n">has_wrong_name</span> <span class="o">=</span> <span class="nb">hasattr</span><span class="p">(</span><span class="bp">self</span><span class="p">,</span> <span class="n">wrong_name</span><span class="p">)</span>
|
|
<span class="k">except</span> <span class="ne">Exception</span><span class="p">:</span>
|
|
<span class="n">has_wrong_name</span> <span class="o">=</span> <span class="kc">False</span>
|
|
<span class="k">if</span> <span class="n">has_wrong_name</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="sa">f</span><span class="s2">"self.</span><span class="si">{</span><span class="n">wrong_name</span><span class="si">}</span><span class="s2">"</span>
|
|
|
|
<span class="k">try</span><span class="p">:</span>
|
|
<span class="kn">import</span><span class="w"> </span><span class="nn">_suggestions</span>
|
|
<span class="k">except</span> <span class="ne">ImportError</span><span class="p">:</span>
|
|
<span class="k">pass</span>
|
|
<span class="k">else</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_suggestions</span><span class="o">.</span><span class="n">_generate_suggestions</span><span class="p">(</span><span class="n">d</span><span class="p">,</span> <span class="n">wrong_name</span><span class="p">)</span>
|
|
|
|
<span class="c1"># Compute closest match</span>
|
|
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">d</span><span class="p">)</span> <span class="o">></span> <span class="n">_MAX_CANDIDATE_ITEMS</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="n">wrong_name_len</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">wrong_name</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">wrong_name_len</span> <span class="o">></span> <span class="n">_MAX_STRING_SIZE</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="kc">None</span>
|
|
<span class="n">best_distance</span> <span class="o">=</span> <span class="n">wrong_name_len</span>
|
|
<span class="n">suggestion</span> <span class="o">=</span> <span class="kc">None</span>
|
|
<span class="k">for</span> <span class="n">possible_name</span> <span class="ow">in</span> <span class="n">d</span><span class="p">:</span>
|
|
<span class="k">if</span> <span class="n">possible_name</span> <span class="o">==</span> <span class="n">wrong_name</span><span class="p">:</span>
|
|
<span class="c1"># A missing attribute is "found". Don't suggest it (see GH-88821).</span>
|
|
<span class="k">continue</span>
|
|
<span class="c1"># No more than 1/3 of the involved characters should need changed.</span>
|
|
<span class="n">max_distance</span> <span class="o">=</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">possible_name</span><span class="p">)</span> <span class="o">+</span> <span class="n">wrong_name_len</span> <span class="o">+</span> <span class="mi">3</span><span class="p">)</span> <span class="o">*</span> <span class="n">_MOVE_COST</span> <span class="o">//</span> <span class="mi">6</span>
|
|
<span class="c1"># Don't take matches we've already beaten.</span>
|
|
<span class="n">max_distance</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">max_distance</span><span class="p">,</span> <span class="n">best_distance</span> <span class="o">-</span> <span class="mi">1</span><span class="p">)</span>
|
|
<span class="n">current_distance</span> <span class="o">=</span> <span class="n">_levenshtein_distance</span><span class="p">(</span><span class="n">wrong_name</span><span class="p">,</span> <span class="n">possible_name</span><span class="p">,</span> <span class="n">max_distance</span><span class="p">)</span>
|
|
<span class="k">if</span> <span class="n">current_distance</span> <span class="o">></span> <span class="n">max_distance</span><span class="p">:</span>
|
|
<span class="k">continue</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">suggestion</span> <span class="ow">or</span> <span class="n">current_distance</span> <span class="o"><</span> <span class="n">best_distance</span><span class="p">:</span>
|
|
<span class="n">suggestion</span> <span class="o">=</span> <span class="n">possible_name</span>
|
|
<span class="n">best_distance</span> <span class="o">=</span> <span class="n">current_distance</span>
|
|
<span class="k">return</span> <span class="n">suggestion</span>
|
|
|
|
|
|
<span class="k">def</span><span class="w"> </span><span class="nf">_levenshtein_distance</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="n">b</span><span class="p">,</span> <span class="n">max_cost</span><span class="p">):</span>
|
|
<span class="c1"># A Python implementation of Python/suggestions.c:levenshtein_distance.</span>
|
|
|
|
<span class="c1"># Both strings are the same</span>
|
|
<span class="k">if</span> <span class="n">a</span> <span class="o">==</span> <span class="n">b</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="mi">0</span>
|
|
|
|
<span class="c1"># Trim away common affixes</span>
|
|
<span class="n">pre</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">while</span> <span class="n">a</span><span class="p">[</span><span class="n">pre</span><span class="p">:]</span> <span class="ow">and</span> <span class="n">b</span><span class="p">[</span><span class="n">pre</span><span class="p">:]</span> <span class="ow">and</span> <span class="n">a</span><span class="p">[</span><span class="n">pre</span><span class="p">]</span> <span class="o">==</span> <span class="n">b</span><span class="p">[</span><span class="n">pre</span><span class="p">]:</span>
|
|
<span class="n">pre</span> <span class="o">+=</span> <span class="mi">1</span>
|
|
<span class="n">a</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">pre</span><span class="p">:]</span>
|
|
<span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="n">pre</span><span class="p">:]</span>
|
|
<span class="n">post</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">while</span> <span class="n">a</span><span class="p">[:</span><span class="n">post</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">]</span> <span class="ow">and</span> <span class="n">b</span><span class="p">[:</span><span class="n">post</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">]</span> <span class="ow">and</span> <span class="n">a</span><span class="p">[</span><span class="n">post</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">==</span> <span class="n">b</span><span class="p">[</span><span class="n">post</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
|
|
<span class="n">post</span> <span class="o">-=</span> <span class="mi">1</span>
|
|
<span class="n">a</span> <span class="o">=</span> <span class="n">a</span><span class="p">[:</span><span class="n">post</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">]</span>
|
|
<span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">[:</span><span class="n">post</span> <span class="ow">or</span> <span class="kc">None</span><span class="p">]</span>
|
|
<span class="k">if</span> <span class="ow">not</span> <span class="n">a</span> <span class="ow">or</span> <span class="ow">not</span> <span class="n">b</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">_MOVE_COST</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">))</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">></span> <span class="n">_MAX_STRING_SIZE</span> <span class="ow">or</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">></span> <span class="n">_MAX_STRING_SIZE</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">max_cost</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
<span class="c1"># Prefer shorter buffer</span>
|
|
<span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o"><</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">):</span>
|
|
<span class="n">a</span><span class="p">,</span> <span class="n">b</span> <span class="o">=</span> <span class="n">b</span><span class="p">,</span> <span class="n">a</span>
|
|
|
|
<span class="c1"># Quick fail when a match is impossible</span>
|
|
<span class="k">if</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">-</span> <span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">))</span> <span class="o">*</span> <span class="n">_MOVE_COST</span> <span class="o">></span> <span class="n">max_cost</span><span class="p">:</span>
|
|
<span class="k">return</span> <span class="n">max_cost</span> <span class="o">+</span> <span class="mi">1</span>
|
|
|
|
<span class="c1"># Instead of producing the whole traditional len(a)-by-len(b)</span>
|
|
<span class="c1"># matrix, we can update just one row in place.</span>
|
|
<span class="c1"># Initialize the buffer row</span>
|
|
<span class="n">row</span> <span class="o">=</span> <span class="nb">list</span><span class="p">(</span><span class="nb">range</span><span class="p">(</span><span class="n">_MOVE_COST</span><span class="p">,</span> <span class="n">_MOVE_COST</span> <span class="o">*</span> <span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">),</span> <span class="n">_MOVE_COST</span><span class="p">))</span>
|
|
|
|
<span class="n">result</span> <span class="o">=</span> <span class="mi">0</span>
|
|
<span class="k">for</span> <span class="n">bindex</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)):</span>
|
|
<span class="n">bchar</span> <span class="o">=</span> <span class="n">b</span><span class="p">[</span><span class="n">bindex</span><span class="p">]</span>
|
|
<span class="n">distance</span> <span class="o">=</span> <span class="n">result</span> <span class="o">=</span> <span class="n">bindex</span> <span class="o">*</span> <span class="n">_MOVE_COST</span>
|
|
<span class="n">minimum</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">maxsize</span>
|
|
<span class="k">for</span> <span class="n">index</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="nb">len</span><span class="p">(</span><span class="n">a</span><span class="p">)):</span>
|
|
<span class="c1"># 1) Previous distance in this row is cost(b[:b_index], a[:index])</span>
|
|
<span class="n">substitute</span> <span class="o">=</span> <span class="n">distance</span> <span class="o">+</span> <span class="n">_substitution_cost</span><span class="p">(</span><span class="n">bchar</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">index</span><span class="p">])</span>
|
|
<span class="c1"># 2) cost(b[:b_index], a[:index+1]) from previous row</span>
|
|
<span class="n">distance</span> <span class="o">=</span> <span class="n">row</span><span class="p">[</span><span class="n">index</span><span class="p">]</span>
|
|
<span class="c1"># 3) existing result is cost(b[:b_index+1], a[index])</span>
|
|
|
|
<span class="n">insert_delete</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">result</span><span class="p">,</span> <span class="n">distance</span><span class="p">)</span> <span class="o">+</span> <span class="n">_MOVE_COST</span>
|
|
<span class="n">result</span> <span class="o">=</span> <span class="nb">min</span><span class="p">(</span><span class="n">insert_delete</span><span class="p">,</span> <span class="n">substitute</span><span class="p">)</span>
|
|
|
|
<span class="c1"># cost(b[:b_index+1], a[:index+1])</span>
|
|
<span class="n">row</span><span class="p">[</span><span class="n">index</span><span class="p">]</span> <span class="o">=</span> <span class="n">result</span>
|
|
<span class="k">if</span> <span class="n">result</span> <span class="o"><</span> <span class="n">minimum</span><span class="p">:</span>
|
|
<span class="n">minimum</span> <span class="o">=</span> <span class="n">result</span>
|
|
<span class="k">if</span> <span class="n">minimum</span> <span class="o">></span> <span class="n">max_cost</span><span class="p">:</span>
|
|
<span class="c1"># Everything in this row is too big, so bail early.</span>
|
|
<span class="k">return</span> <span class="n">max_cost</span> <span class="o">+</span> <span class="mi">1</span>
|
|
<span class="k">return</span> <span class="n">result</span>
|
|
</pre></div>
|
|
|
|
<div class="clearer"></div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="sphinxsidebar" role="navigation" aria-label="Main">
|
|
<div class="sphinxsidebarwrapper">
|
|
<p class="logo"><a href="../index.html">
|
|
<img class="logo" src="../_static/evennia_logo.png" alt="Logo of Evennia"/>
|
|
</a></p>
|
|
<search id="searchbox" style="display: none" role="search">
|
|
<h3 id="searchlabel">Quick search</h3>
|
|
<div class="searchformwrapper">
|
|
<form class="search" action="../search.html" method="get">
|
|
<input type="text" name="q" aria-labelledby="searchlabel" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false"/>
|
|
<input type="submit" value="Go" />
|
|
</form>
|
|
</div>
|
|
</search>
|
|
<script>document.getElementById('searchbox').style.display = "block"</script><h3>Links</h3>
|
|
<ul>
|
|
<li><a href="https://www.evennia.com/docs/latest/index.html">Documentation Top</a> </li>
|
|
<li><a href="https://www.evennia.com">Evennia Home</a> </li>
|
|
<li><a href="https://github.com/evennia/evennia">Github</a> </li>
|
|
<li><a href="http://games.evennia.com">Game Index</a> </li>
|
|
<li>
|
|
<a href="https://discord.gg/AJJpcRUhtF">Discord</a> -
|
|
<a href="https://github.com/evennia/evennia/discussions">Discussions</a> -
|
|
<a href="https://evennia.blogspot.com/">Blog</a>
|
|
</li>
|
|
</ul>
|
|
<h3>Doc Versions</h3>
|
|
<ul>
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/latest/index.html">latest (main branch)</a>
|
|
</li>
|
|
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/5.x/index.html">v5.0.0 branch (outdated)</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/4.x/index.html">v4.0.0 branch (outdated)</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/3.x/index.html">v3.0.0 branch (outdated)</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/2.x/index.html">v2.0.0 branch (outdated)</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/1.x/index.html">v1.0.0 branch (outdated)</a>
|
|
</li>
|
|
|
|
<li>
|
|
<a href="https://www.evennia.com/docs/0.x/index.html">v0.9.5 branch (outdated)</a>
|
|
</li>
|
|
|
|
</ul>
|
|
|
|
</div>
|
|
</div>
|
|
<div class="clearer"></div>
|
|
</div>
|
|
<div class="related" role="navigation" aria-label="Related">
|
|
<h3>Navigation</h3>
|
|
<ul>
|
|
<li class="right" style="margin-right: 10px">
|
|
<a href="../genindex.html" title="General Index"
|
|
>index</a></li>
|
|
<li class="right" >
|
|
<a href="../py-modindex.html" title="Python Module Index"
|
|
>modules</a> |</li>
|
|
<li class="nav-item nav-item-0"><a href="../index.html">Evennia</a> »</li>
|
|
<li class="nav-item nav-item-1"><a href="index.html" >Module code</a> »</li>
|
|
<li class="nav-item nav-item-this"><a href="">traceback</a></li>
|
|
</ul>
|
|
</div>
|
|
<div class="footer" role="contentinfo">
|
|
© Copyright 2024, The Evennia developer community.
|
|
Created using <a href="https://www.sphinx-doc.org/">Sphinx</a> 8.2.3.
|
|
</div>
|
|
</body>
|
|
</html> |