In article <54521c8f$0$12982$c3e8da3$54964...@news.astraweb.com>, Steven D'Aprano <steve+comp.lang.pyt...@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 :-) -- https://mail.python.org/mailman/listinfo/python-list