@@ -261,6 +261,14 @@ def _repr_pretty_(self, p, cycle):
261
261
template = "<{0}({1.year}, {1.day}) at {2} - {1.title}>"
262
262
p .text (template .format (type (self ).__name__ , self , hex (id (self ))))
263
263
264
+ def _coerce_val (self , val ):
265
+ if isinstance (val , float ) and val .is_integer ():
266
+ log .warning ("coerced value %r for %d/%02d" , val , self .year , self .day )
267
+ val = int (val )
268
+ if isinstance (val , int ):
269
+ val = str (val )
270
+ return val
271
+
264
272
@property
265
273
def answer_a (self ):
266
274
try :
@@ -270,8 +278,7 @@ def answer_a(self):
270
278
271
279
@answer_a .setter
272
280
def answer_a (self , val ):
273
- if isinstance (val , int ):
274
- val = str (val )
281
+ val = self ._coerce_val (val )
275
282
if getattr (self , "answer_a" , None ) == val :
276
283
return
277
284
self ._submit (value = val , part = "a" )
@@ -289,8 +296,7 @@ def answer_b(self):
289
296
290
297
@answer_b .setter
291
298
def answer_b (self , val ):
292
- if isinstance (val , int ):
293
- val = str (val )
299
+ val = self ._coerce_val (val )
294
300
if getattr (self , "answer_b" , None ) == val :
295
301
return
296
302
self ._submit (value = val , part = "b" )
@@ -325,7 +331,8 @@ def incorrect_answers_b(self):
325
331
def _submit (self , value , part , reopen = True , quiet = False ):
326
332
if value in {u"" , b"" , None , b"None" , u"None" }:
327
333
raise AocdError ("cowardly refusing to submit non-answer: {!r}" .format (value ))
328
- value = str (value )
334
+ if not isinstance (value , str ):
335
+ value = self ._coerce_val (value )
329
336
part = str (part ).replace ("1" , "a" ).replace ("2" , "b" ).lower ()
330
337
if part not in {"a" , "b" }:
331
338
raise AocdError ('part must be "a" or "b"' )
0 commit comments