Python Style Question

Steven D'Aprano steve+comp.lang.python at pearwood.info
Thu Oct 30 23:48:10 CET 2014


MRAB wrote:

> On 2014-10-30 11:10, Steven D'Aprano wrote:
>> Anton wrote:
>>
>>> Let's say I have an incoming list of values *l*. Every element of *l*
>>> can be one of the following options:
>>> 1) an integer value
>>> 2) a string in form of '<int_value>', e.g. '7'
>>> 3) a string with a json serialization of an integer value, e.g. '"7"'
>>> 4) something else that should be ignored
>>>
>>> I need to transform this list into another list with values from options
>>> 1)-3) coerced to int. The code below should do this.
>>
>> I don't particularly like either version. I prefer this:
>>
>> def load_int(obj):
>>      if isinstance(obj, int):
>>          # Case 1), an int, e.g. 7
>>          return obj
>>      elif isinstance(obj, str):
>>          # Case 2) and 3), a str or JSON serialised int.
>>          # E.g. '7' or '"7"'.
>>          try:
>>              return int(obj)
>>          except ValueError:
>>              return int(json.loads(obj))
>>      raise TypeError('require int or str, got %s' % type(obj).__name__)
>>
> [snip]
> 
> How about:
> 
> int(str(obj).strip('"'))

Absolutely not.

obj = '""""""""""""""1\n\n\n\n'  # not valid JSON
load_int(obj)
=> raises ValueError
int(str(obj).strip('"'))
=> wrongly returns 1


-- 
Steven




More information about the Python-list mailing list