| #!/usr/bin/python -u |
| # |
| # Copyright (c) 2012 The Chromium OS Authors. All rights reserved. |
| # Use of this source code is governed by a BSD-style license that can be |
| # found in the LICENSE file. |
| |
| '''Wrappers to convert Unicode strings to UTF-8 strings.''' |
| |
| import types |
| |
| |
| def UnicodeToString(obj): |
| '''Converts any Unicode strings in obj to UTF-8 strings. |
| |
| Recurses into lists, dicts, and tuples in obj. |
| ''' |
| if isinstance(obj, list): |
| return [UnicodeToString(x) for x in obj] |
| elif isinstance(obj, dict): |
| return dict((UnicodeToString(k), UnicodeToString(v)) |
| for k, v in obj.iteritems()) |
| elif isinstance(obj, unicode): |
| return obj.encode('utf-8') |
| elif isinstance(obj, tuple): |
| return tuple(UnicodeToString(x) for x in obj) |
| elif isinstance(obj, set): |
| return set(UnicodeToString(x) for x in obj) |
| else: |
| return obj |
| |
| |
| def UnicodeToStringArgs(function): |
| '''A function decorator that converts function's arguments from |
| Unicode to strings using UnicodeToString. |
| ''' |
| return (lambda *args, **kwargs: |
| function(*UnicodeToString(args), |
| **UnicodeToString(kwargs))) |
| |
| |
| def UnicodeToStringClass(cls): |
| '''A class decorator that converts all arguments of all |
| methods in class from Unicode to strings using UnicodeToStringArgs.''' |
| for k, v in cls.__dict__.items(): |
| if type(v) == types.FunctionType: |
| setattr(cls, k, UnicodeToStringArgs(v)) |
| return cls |