Python Style Question
Roy Smith
roy at panix.com
Thu Oct 30 20:34:27 EDT 2014
In article <54521c8f$0$12982$c3e8da3$5496439d at news.astraweb.com>,
Steven D'Aprano <steve+comp.lang.python at pearwood.info> 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__)
Depending on how strictly you're trying to do input validation, the
int(json.loads(obj)) may not be what you want. It allows well-formed
json encoding floats, for example.
And, of course, since
>>> isinstance(True, int)
True
this code accepts booleans. Oh, but wait, that's by design :-)
More information about the Python-list
mailing list