def list_or_args(keys, args): # returns a single new list combining keys and args try: iter(keys) # a string or bytes instance can be iterated, but indicates # keys wasn't passed as a list if isinstance(keys, (bytes, str)): keys = [keys] else: keys = list(keys) except TypeError: keys = [keys] if args: keys.extend(args) return keys def nativestr(x): """Return the decoded binary string, or a string, depending on type.""" return x.decode("utf-8", "replace") if isinstance(x, bytes) else x def delist(x): """Given a list of binaries, return the stringified version.""" return [nativestr(obj) for obj in x] def parse_to_list(response): """Optimistally parse the response to a list. """ res = [] for item in response: try: res.append(int(item)) except ValueError: res.append(nativestr(item)) except TypeError: res.append(None) return res