In Lib/traceback.py, the public helpers print_list() and format_list() independently contain the same formatting expression, so their outputs agree only by duplication. We propose routing print_list() through format_list() so that they share a single formatting path, with no change in behavior.
Problem
format_list() returns the formatted lines:
def format_list(extracted_list):
return StackSummary.from_list(extracted_list).format()
print_list() writes those same lines, but re-derives them with the identical expression instead of reusing format_list():
def print_list(extracted_list, file=None):
if file is None:
file = sys.stderr
for item in StackSummary.from_list(extracted_list).format():
print(item, file=file, end="")
The outputs match only because StackSummary.from_list(extracted_list).format() is duplicated in both. Any future change to how a frame list is formatted has to be applied in both places to prevent the two public helpers from silently diverging.
Solution
Have print_list() iterate format_list():
def print_list(extracted_list, file=None):
if file is None:
file = sys.stderr
for item in format_list(extracted_list):
print(item, file=file, end="")
This eliminates the possibility of drift and mirrors the delegation already used in this module; for example, print_tb() calls print_list() rather than re-deriving extract_tb(...).format().
Linked PRs
In
Lib/traceback.py, the public helpersprint_list()andformat_list()independently contain the same formatting expression, so their outputs agree only by duplication. We propose routingprint_list()throughformat_list()so that they share a single formatting path, with no change in behavior.Problem
format_list()returns the formatted lines:print_list()writes those same lines, but re-derives them with the identical expression instead of reusingformat_list():The outputs match only because
StackSummary.from_list(extracted_list).format()is duplicated in both. Any future change to how a frame list is formatted has to be applied in both places to prevent the two public helpers from silently diverging.Solution
Have
print_list()iterateformat_list():This eliminates the possibility of drift and mirrors the delegation already used in this module; for example,
print_tb()callsprint_list()rather than re-derivingextract_tb(...).format().Linked PRs