Python - JSON模块代码中没有参数的构造函数

时间:2016-02-11 20:38:16

标签: python json

在Python的json模块源代码中,我看到了:

def JSONObject(s_and_end, encoding, strict, scan_once, object_hook,
           object_pairs_hook, _w=WHITESPACE.match, _ws=WHITESPACE_STR):
        ...

def __init__(self, encoding=None, object_hook=None, parse_float=None,
        parse_int=None, parse_constant=None, strict=True,
        object_pairs_hook=None):
        ...
        self.parse_object = JSONObject

JSONObject函数的参数是否被隐含地传递,或者我错过了什么?

2 个答案:

答案 0 :(得分:3)

self.parse_object = JSONObject未调用该函数,因此不需要参数。相反,self.parse_object指的是JSONObject函数本身。之后的代码可以通过执行json_obj = self.parse_object(param0, param1, ...)来调用该函数。

答案 1 :(得分:1)

您错过了py_make_scanner() function

def py_make_scanner(context):
    parse_object = context.parse_object

    # ...

    elif nextchar == '{':
        return parse_object((string, idx + 1), encoding, strict,
            _scan_once, object_hook, object_pairs_hook)

其中JSONDecoder()个实例作为context传入。因此,context.parse_object JSONDecoder().parse_objectJSONObject,或者如果您愿意,可以使用不同的可调用对象,由子类设置或直接设置该属性。

py_make_scanner是一个纯Python实现;还有一个C implementationparse_object也有一个C实现(str versionunicode version)。

要完整循环,make_scanner()实例会再次使用JSONDecoder的结果; self.parse_object = JSONObject行以下几行是:

self.scan_once = scanner.make_scanner(self)

self.scan_once中使用了JSONDecoder.raw_decode()