Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from functools import wraps
- def encoder(m='ignore'):
- """
- The method m can be strict, replace and ignore.
- This decorator encodes arguments which are str.
- The output is decoded. Tuple, List, Dict and str is supported.
- """
- def fun(func):
- if m not in ['strict', 'ignore', 'replace']:
- raise Exception('use: stict, ignore, replace')
- @wraps(func)
- def inner(*args, **kwargs):
- func.__defaults__ = tuple([s.encode() if isinstance(s, str) else s for s in func.__defaults__])
- args = [a.encode(errors=m) if isinstance(a, str) else a for a in args]
- kwargs = {k: (v.encode(errors=m) if isinstance(v, str) else v) for k, v in kwargs.items()}
- ret = func(*args, **kwargs)
- if isinstance(ret, (tuple, list)):
- ret = [a.decode(errors=m) if isinstance(a, bytes) else a for a in ret]
- elif isinstance(ret, dict):
- ret = {k: (v.decode(errors=m) if isinstance(v, bytes) else v) for k, v in ret.items()}
- elif isinstance(ret, set):
- ret = {v.decode(errors=m) if isinstance(ret, bytes) else v for v in ret}
- elif isinstance(ret, bytes):
- ret = ret.decode(errors=m)
- return ret
- return inner
- return fun
- @encoder()
- def foo(a, b, c='20ööö'):
- print('a:', a)
- print('b:', b)
- print('c:', c)
- return [a, b, c]
- if __name__ == '__main__':
- print(foo('ÄÄÄÄöööööüüüü???ßßßþþ', 'ABC'))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement