-
Notifications
You must be signed in to change notification settings - Fork 52
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[New] SaveframeReader class (PyInf#13916) #384
base: master
Are you sure you want to change the base?
Conversation
**Background:** In deshaw#356, we added a new utility named `saveframe` in Pyflyby, that can be used to save information for debugging / reproducing an issue. **Issue:** The `saveframe` utility saves data as a pickled Python dictionary. Reading this raw data and extracting values of specific variables or metadata fields can be complex. This commit adds a new class named `SaveframeReader`, for reading data saved by the `saveframe` utility. The `SaveframeReader` class provides an easy and efficient way to read the raw data and extract specific items. This class has a user-friendly `repr` for visualizing the data and provides various helpful methods to extract different items. **Usage Example:** **Creating an instance** First, create an instance of this class by passing the path of the file that contains the `saveframe` data. ``` >>> from pyflyby import SaveframeReader >>> reader = SaveframeReader('/path/to/file') ``` **Extracting all available metadata fields** To extract all available metadata fields, use the `SaveframeReader.metadata` property. Example: ``` >>> reader.metadata ['frame_index', 'filename', 'lineno', 'function_name', 'function_qualname', 'function_object', 'module_name', 'code', 'frame_identifier', 'exception_string', 'exception_full_string', 'exception_class_name', 'exception_class_qualname', 'exception_object', 'traceback'] ``` **Extracting all stored local variables** To extract the names of all local variables stored in the frames, use the `SaveframeReader.variables` property. Example: ``` >>> reader.variables { 1: ['var1', 'var2', ...], 2: ['var5', 'var8', 'var9', ...], ... } ``` **Extracting the value of a specific metadata field** To extract the value of a specific metadata field, use the `SaveframeReader.get_metadata` method. Example: ``` >> reader.get_metadata("filename") {1: '/dir1/mod1.py', 2: '/dir2/mod2.py', ...} >> reader.get_metadata("filename", frame_idx=2) '/dir2/mod2.py' >> reader.get_metadata("exception_string") "Error is raised" ``` **Extracting the value of specific local variables** To extract the value of specific local variable(s), use the `SaveframeReader.get_variables` method. Example: ``` >> reader.get_variables('var1') {2: var1_value2, 4: var1_value4} >> reader.get_variables('var1', frame_idx=4) var1_value4 >> reader.get_variables('var2') var2_value3 >> reader.get_variables(['var1', 'var3']) {2: {'var1': var1_value2, 'var3': var3_value2}, 4: {'var1': var1_value4}, 5: {'var3': var3_value5}} >> reader.get_variables(['var1', 'var3'], frame_idx=2) {'var1': var1_value2, 'var3': var3_value2} ``` **NOTE:** Raw data can be extracted using `SaveframeReader.data` property. Request: PyInf#13916
cc @sac111gp |
56d9d39
to
b377c95
Compare
Adding @rakh-deshaw for review |
e41b4a2
to
ed1953c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
lgtm.
Have few queries and suggestions but nothing should be a blocker to merge.
f"'variables' must either be a string or a list/tuple. " | ||
f"Got '{type(variables).__name__}'.") | ||
if len(variables) == 0: | ||
raise ValueError("No 'variables' passed.") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Fine to ignore for v1.
Why didn't we plan to show all variable values for a specific frame_idx? Considering the function name is get_variables
- the default sounds like we should return ALL
.
reader.get_variables(frame_idx=4)
looks like a valid usecase.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Usually for reproducing / debugging an issue, we only need few specific variables. That was the reason we didn't consider returning all the variable values.
But we can do it in v2 if any use-case comes. Thanks for pointing.
1a440d4
to
86cb9b7
Compare
Background:
In #356, we added a new utility named
saveframe
in Pyflyby, that can be used to save information for debugging / reproducing an issue.Issue:
The
saveframe
utility saves data as a pickled Python dictionary. Reading this raw data and extracting values of specific variables or metadata fields can be complex.This commit adds a new class named
SaveframeReader
, for reading data saved by thesaveframe
utility.The
SaveframeReader
class provides an easy and efficient way to read the raw data and extract specific items. This class has a user-friendlyrepr
for visualizing the data and provides various helpful methods to extract different items.Usage Example:
Creating an instance
First, create an instance of this class by passing the path of the file that contains the
saveframe
data.Extracting all available metadata fields
To extract all available metadata fields, use the
SaveframeReader.metadata
property. Example:Extracting all stored local variables
To extract the names of all local variables stored in the frames, use the
SaveframeReader.variables
property. Example:Extracting the value of a specific metadata field
To extract the value of a specific metadata field, use the
SaveframeReader.get_metadata
method. Example:Extracting the value of specific local variables
To extract the value of specific local variable(s), use the
SaveframeReader.get_variables
method. Example:NOTE: Raw data can be extracted using
SaveframeReader.data
property.Request: PyInf#13916