我想查看使用json.loads()将json字符串转换为python字典时正在执行什么代码
例如
import json
s = '{"a": 1, "b": 2}' # input json string
d = json.loads(s) # output dictionary object
我试图通过调试代码并到达核心逻辑并进行解析来了解内部逻辑。
import json
s = '{"a": 1, "b": 2}' # input json string
import pdb; pdb.set_trace()
d = json.loads(s) # output dictionary object
通过进入d = json.loads(s)
,我可以到达json/init.py中的loads()
进一步将我带入json/decoder.py的decode()
类中的raw_decode()
和JSONDecoder
方法中
def raw_decode(self, s, idx=0):
"""Decode a JSON document from ``s`` (a ``str`` beginning with
a JSON document) and return a 2-tuple of the Python
representation and the index in ``s`` where the document ended.
This can be used to decode a JSON document from a string that may
have extraneous data at the end.
"""
try:
obj, end = self.scan_once(s, idx)
except StopIteration as err:
raise JSONDecodeError("Expecting value", s, err.value) from None
return obj, end
在raw_decode()
中,我无法进一步进入obj, end = self.scan_once(s, idx)
pdd,将我发送到最后一行return obj, end
(Pdb) l
350 This can be used to decode a JSON document from a string that may
351 have extraneous data at the end.
352
353 """
354 try:
355 -> obj, end = self.scan_once(s, idx)
356 except StopIteration as err:
357 raise JSONDecodeError("Expecting value", s, err.value) from None
358 return obj, end
[EOF]
(Pdb) s
> /usr/lib/python3.6/json/decoder.py(358)raw_decode()
-> return obj, end
(Pdb)
我希望看到内部代码,并且希望使用pdb来访问该代码,因为我希望进入pdb
会进入内部代码。
我甚至无法在json/scanner.py和make_scanner = c_make_scanner or py_make_scanner
模块中访问_json
。
如何使用调试来达到核心迭代和解析逻辑?
答案 0 :(得分:2)
我相信这是因为Python使用的是JSON扫描器的本机版本,所以您不能使用Python调试器。参见json/scanner.py:
try:
from _json import make_scanner as c_make_scanner
except ImportError:
c_make_scanner = None
如果C /本机版本不可用,则使用以Python编写的后备版本(也在上面链接的文件中定义)。