2016-02-11 102 views
1

参数构造函数在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功能,还是我失去了一些东西?

+0

为了匹配问题内容,​​你能否让这个问题的标题更加专注?我想到的一个编辑是“JSON模块代码中没有参数的构造函数” - 你觉得这个合适吗? – Vulcan

+0

完成,谢谢!我正在用尽想法... –

回答

3

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

+0

JSONObject类的定义在哪里?我在代码中看不到它。 –

+0

@JahMyst它是一个函数。你在问题中包含了定义的第一行。 –

+0

@JahMyst我的错误,编辑答案正确地说它的功能,而不是一个类。 – Vulcan

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_objectJSONDecoder().parse_objectJSONObject,或者如果你愿意,可以调用一个不同的可调用的,由子类设置或直接设置该属性。

py_make_scanner是一个纯粹的Python实现;还有一个C implementation,并且还有一个用于parse_object的C实现(str versionunicode version)。

为了满圈,make_scanner()的结果再次被JSONDecoder实例使用;只是self.parse_object = JSONObject线以下几行是:

self.scan_once = scanner.make_scanner(self) 

self.scan_onceJSONDecoder.raw_decode()被使用。

+0

现在我明白了,但是名称JSONObject在调用**时指的是**?如果scanner.make_scanner位于后面,它应该抛出一个NameError,不应该吗? –

+0

@JahMyst Python名称引用对象。 'JSONObject'引用一个函数对象,由你包含在你的问题的第一行的函数定义创建。然后,对同一个函数的引用作为'parse_object'属性存储在'JSONDecoder()'实例中。 'make_scanner()'callable接受该属性,并在'parse_object'中存储对该函数对象的另一个引用。嵌套函数'_scan_once()'使用后者引用来最终调用函数。 –

+0

@JahMyst'_scan_once()'返回给'make_scanner()'的调用者,并且该引用存储为'JSONDecoder()。scan_once()'属性。所以调用'JSONDecoder()。scan_once()'可以调用'JSONObject()'函数,因为它有一个引用。所有这些都存在,所以如果你想改变解码器的行为,你可以传入不同的可调用对象。 –