@@ -124,7 +124,7 @@ class YajlParser(object):
124
124
'''
125
125
A class that utilizes the Yajl C Library
126
126
'''
127
- def __init__ (self , content_handler , allow_comments = True , check_utf8 = True , buf_siz = 65536 ):
127
+ def __init__ (self , content_handler = None , allow_comments = True , check_utf8 = True , buf_siz = 65536 ):
128
128
'''
129
129
`content_handler` an instance of a subclass of YajlContentHandler
130
130
`allow_comments` specifies whether comments are allowed in the document
@@ -169,28 +169,31 @@ def dispatch(func, *args, **kwargs):
169
169
self ._exc_info = sys .exc_info ()
170
170
return 0
171
171
172
- callbacks = [
173
- yajl_null , yajl_boolean , yajl_integer , yajl_double ,
174
- yajl_number , yajl_string ,
175
- yajl_start_map , yajl_map_key , yajl_end_map ,
176
- yajl_start_array , yajl_end_array ,
177
- ]
178
- # cannot have both number and integer|double
179
- if hasattr (content_handler , 'yajl_number' ):
180
- # if yajl_number is available, it takes precedence
181
- callbacks [2 ] = callbacks [3 ] = 0
172
+ if content_handler is None :
173
+ self .callbacks = None
182
174
else :
183
- callbacks [4 ] = 0
184
- # cast the funcs to C-types
185
- callbacks = [
186
- c_func (callback )
187
- for c_func , callback in zip (c_funcs , callbacks )
188
- ]
175
+ callbacks = [
176
+ yajl_null , yajl_boolean , yajl_integer , yajl_double ,
177
+ yajl_number , yajl_string ,
178
+ yajl_start_map , yajl_map_key , yajl_end_map ,
179
+ yajl_start_array , yajl_end_array ,
180
+ ]
181
+ # cannot have both number and integer|double
182
+ if hasattr (content_handler , 'yajl_number' ):
183
+ # if yajl_number is available, it takes precedence
184
+ callbacks [2 ] = callbacks [3 ] = 0
185
+ else :
186
+ callbacks [4 ] = 0
187
+ # cast the funcs to C-types
188
+ callbacks = [
189
+ c_func (callback )
190
+ for c_func , callback in zip (c_funcs , callbacks )
191
+ ]
192
+ self .callbacks = byref (yajl_callbacks (* callbacks ))
189
193
190
194
# set self's vars
191
195
self .buf_siz = buf_siz
192
196
self .cfg = yajl_parser_config (allow_comments , check_utf8 )
193
- self .callbacks = yajl_callbacks (* callbacks )
194
197
self .content_handler = content_handler
195
198
196
199
def parse (self , f = sys .stdin , ctx = None ):
@@ -205,16 +208,18 @@ def parse(self, f=sys.stdin, ctx=None):
205
208
returns 0 should set internal variables to denote
206
209
why they cancelled the parsing.
207
210
'''
208
- self .content_handler .parse_start ()
209
- hand = yajl .yajl_alloc ( byref (self .callbacks ), byref (self .cfg ), None , ctx )
211
+ if self .content_handler :
212
+ self .content_handler .parse_start ()
213
+ hand = yajl .yajl_alloc (self .callbacks , byref (self .cfg ), None , ctx )
210
214
try :
211
215
while 1 :
212
216
fileData = f .read (self .buf_siz )
213
217
if not fileData :
214
218
stat = yajl .yajl_parse_complete (hand )
215
219
else :
216
220
stat = yajl .yajl_parse (hand , fileData , len (fileData ))
217
- self .content_handler .parse_buf ()
221
+ if self .content_handler :
222
+ self .content_handler .parse_buf ()
218
223
if stat not in (yajl_status_ok .value ,
219
224
yajl_status_insufficient_data .value ):
220
225
if stat == yajl_status_client_canceled .value :
@@ -230,7 +235,8 @@ def parse(self, f=sys.stdin, ctx=None):
230
235
hand , 1 , fileData , len (fileData ))
231
236
raise YajlError (error )
232
237
if not fileData :
233
- self .content_handler .parse_complete ()
238
+ if self .content_handler :
239
+ self .content_handler .parse_complete ()
234
240
break
235
241
finally :
236
242
yajl .yajl_free (hand )
0 commit comments