Advertisement
DeaD_EyE

encoder decorator

Aug 12th, 2016
190
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.52 KB | None | 0 0
  1. from functools import wraps
  2.  
  3.  
  4. def encoder(m='ignore'):
  5.     """
  6.    The method m can be strict, replace and ignore.
  7.    This decorator encodes arguments which are str.
  8.    The output is decoded. Tuple, List, Dict and str is supported.
  9.    """
  10.     def fun(func):
  11.         if m not in ['strict', 'ignore', 'replace']:
  12.             raise Exception('use: stict, ignore, replace')
  13.         @wraps(func)
  14.         def inner(*args, **kwargs):
  15.             func.__defaults__ = tuple([s.encode() if isinstance(s, str) else s for s in func.__defaults__])
  16.             args = [a.encode(errors=m) if isinstance(a, str) else a for a in args]
  17.             kwargs = {k: (v.encode(errors=m) if isinstance(v, str) else v) for k, v in kwargs.items()}
  18.             ret = func(*args, **kwargs)
  19.             if isinstance(ret, (tuple, list)):
  20.                 ret = [a.decode(errors=m) if isinstance(a, bytes) else a for a in ret]
  21.             elif isinstance(ret, dict):
  22.                 ret = {k: (v.decode(errors=m) if isinstance(v, bytes) else v) for k, v in ret.items()}
  23.             elif isinstance(ret, set):
  24.                 ret = {v.decode(errors=m) if isinstance(ret, bytes) else v for v in ret}
  25.             elif isinstance(ret, bytes):
  26.                 ret = ret.decode(errors=m)
  27.             return ret
  28.         return inner
  29.     return fun
  30.  
  31. @encoder()
  32. def foo(a, b, c='20ööö'):
  33.     print('a:', a)
  34.     print('b:', b)
  35.     print('c:', c)
  36.     return [a, b, c]
  37.  
  38. if __name__ == '__main__':
  39.     print(foo('ÄÄÄÄöööööüüüü???ßßßþþ', 'ABC'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement