在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 :(得分: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_object
是JSONObject
,或者如果您愿意,可以使用不同的可调用对象,由子类设置或直接设置该属性。
py_make_scanner
是一个纯Python实现;还有一个C implementation,parse_object
也有一个C实现(str
version和unicode
version)。
要完整循环,make_scanner()
实例会再次使用JSONDecoder
的结果; self.parse_object = JSONObject
行以下几行是:
self.scan_once = scanner.make_scanner(self)
和self.scan_once
中使用了JSONDecoder.raw_decode()
。