py3: provide (del|get|has|set)attr wrappers that accepts bytes

These functions will be imported automagically by our code transformer.

getattr() and setattr() are widely used in our code. We wouldn't probably
want to rewrite every single call of getattr/setattr. delattr() and hasattr()
aren't that important, but they are functions of the same kind.
This commit is contained in:
Yuya Nishihara 2016-08-14 12:51:21 +09:00
parent df4c2c74a3
commit 29c5e8dc21

View File

@ -31,8 +31,22 @@ else:
if sys.version_info[0] >= 3:
import builtins
import functools
builtins.xrange = range
def _wrapattrfunc(f):
@functools.wraps(f)
def w(object, name, *args):
if isinstance(name, bytes):
name = name.decode(u'utf-8')
return f(object, name, *args)
return w
delattr = _wrapattrfunc(builtins.delattr)
getattr = _wrapattrfunc(builtins.getattr)
hasattr = _wrapattrfunc(builtins.hasattr)
setattr = _wrapattrfunc(builtins.setattr)
stringio = io.StringIO
empty = _queue.Empty
queue = _queue.Queue