@@ -261,6 +261,14 @@ def _repr_pretty_(self, p, cycle):
261261 template = "<{0}({1.year}, {1.day}) at {2} - {1.title}>"
262262 p .text (template .format (type (self ).__name__ , self , hex (id (self ))))
263263
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+
264272 @property
265273 def answer_a (self ):
266274 try :
@@ -270,8 +278,7 @@ def answer_a(self):
270278
271279 @answer_a .setter
272280 def answer_a (self , val ):
273- if isinstance (val , int ):
274- val = str (val )
281+ val = self ._coerce_val (val )
275282 if getattr (self , "answer_a" , None ) == val :
276283 return
277284 self ._submit (value = val , part = "a" )
@@ -289,8 +296,7 @@ def answer_b(self):
289296
290297 @answer_b .setter
291298 def answer_b (self , val ):
292- if isinstance (val , int ):
293- val = str (val )
299+ val = self ._coerce_val (val )
294300 if getattr (self , "answer_b" , None ) == val :
295301 return
296302 self ._submit (value = val , part = "b" )
@@ -325,7 +331,8 @@ def incorrect_answers_b(self):
325331 def _submit (self , value , part , reopen = True , quiet = False ):
326332 if value in {u"" , b"" , None , b"None" , u"None" }:
327333 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 )
329336 part = str (part ).replace ("1" , "a" ).replace ("2" , "b" ).lower ()
330337 if part not in {"a" , "b" }:
331338 raise AocdError ('part must be "a" or "b"' )
0 commit comments