Skip to content

Commit 73efd89

Browse files
committed
Fix rich inspection
Fixes Rich variable inspection vs `user_expressions` #772
1 parent e41c242 commit 73efd89

File tree

1 file changed

+32
-45
lines changed

1 file changed

+32
-45
lines changed

ipykernel/debugger.py

Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -511,66 +511,53 @@ async def inspectVariables(self, message):
511511

512512
async def richInspectVariables(self, message):
513513
reply = {
514-
'type': 'response',
515-
'sequence_seq': message['seq'],
516-
'success': False,
517-
'command': message['command']
514+
"type": "response",
515+
"sequence_seq": message["seq"],
516+
"success": False,
517+
"command": message["command"],
518518
}
519-
520-
var_name = message['arguments']['variableName']
519+
520+
var_name = message["arguments"]["variableName"]
521521
valid_name = str.isidentifier(var_name)
522522
if not valid_name:
523-
reply['body'] = {
524-
'data': {},
525-
'metadata': {}
526-
}
527-
if var_name == 'special variables' or var_name == 'function variables':
528-
reply['success'] = True
523+
reply["body"] = {"data": {}, "metadata": {}}
524+
if var_name == "special variables" or var_name == "function variables":
525+
reply["success"] = True
529526
return reply
530527

531-
var_repr_data = var_name + '_repr_data'
532-
var_repr_metadata = var_name + '_repr_metadata'
533-
534-
if not self.breakpoint_list:
528+
repr_data = {}
529+
repr_metadata = {}
530+
if not self.stopped_threads:
535531
# The code did not hit a breakpoint, we use the intepreter
536532
# to get the rich representation of the variable
537-
var_repr_data, var_repr_metadata = get_ipython().display_formatter.format(var_name)
533+
result = get_ipython().user_expressions({var_name: var_name})[var_name]
534+
if result.get("status", "error") == "ok":
535+
repr_data = result.get("data", {})
536+
repr_metadata = result.get("metadata", {})
538537
else:
539538
# The code has stopped on a breakpoint, we use the setExpression
540539
# request to get the rich representation of the variable
541-
lvalue = var_repr_data + ',' + var_repr_metadata
542-
code = 'get_ipython().display_formatter.format(' + var_name+')'
543-
frame_id = message['arguments']['frameId']
544-
seq = message['seq']
545-
request = {
546-
'type': 'request',
547-
'command': 'setExpression',
548-
'seq': seq+1,
549-
'arguments': {
550-
'expression': lvalue,
551-
'value': code,
552-
'frameId': frame_id
540+
code = "get_ipython().display_formatter.format(" + var_name + ")"
541+
frame_id = message["arguments"]["frameId"]
542+
seq = message["seq"]
543+
reply = await self._forward_message(
544+
{
545+
"type": "request",
546+
"command": "evaluate",
547+
"seq": seq + 1,
548+
"arguments": {"expression": code, "frameId": frame_id},
553549
}
554-
}
555-
await self._forward_message(request)
550+
)
551+
if reply["success"]:
552+
repr_data, repr_metadata = eval(reply["body"]["result"], {}, {})
556553

557-
repr_data = globals()[var_repr_data]
558-
repr_metadata = globals()[var_repr_metadata]
559554
body = {
560-
'data': {},
561-
'metadata': {}
555+
"data": repr_data,
556+
"metadata": {k: v for k, v in repr_metadata.items() if k in repr_data},
562557
}
563558

564-
for key, value in repr_data.items():
565-
body['data']['key'] = value
566-
if key in repr_metadata:
567-
body['metadata'][key] = repr_metadata[key]
568-
569-
globals().pop(var_repr_data)
570-
globals().pop(var_repr_metadata)
571-
572-
reply['body'] = body
573-
reply['success'] = True
559+
reply["body"] = body
560+
reply["success"] = True
574561
return reply
575562

576563
async def process_request(self, message):

0 commit comments

Comments
 (0)