无法使用pdb探索json.loads()代码

时间:2018-08-03 14:33:04

标签: python json debugging pdb

我想查看使用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.pydecode()类中的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.pymake_scanner = c_make_scanner or py_make_scanner模块中访问_json

如何使用调试来达到核心迭代和解析逻辑?

1 个答案:

答案 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编写的后备版本(也在上面链接的文件中定义)。