2016-02-11 101 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()'函數,因爲它有一個引用。所有這些都存在,所以如果你想改變解碼器的行爲,你可以傳入不同的可調用對象。 –