58 lines
1.2 KiB
Python
58 lines
1.2 KiB
Python
"""
|
|
Compatibility tools for differences between Python 2 and 3
|
|
"""
|
|
asunicode = lambda x, _: str(x) # noqa:E731
|
|
|
|
|
|
__all__ = [
|
|
"asunicode",
|
|
"asstr",
|
|
"asbytes",
|
|
"lmap",
|
|
"lzip",
|
|
"lrange",
|
|
"lfilter",
|
|
"with_metaclass",
|
|
]
|
|
|
|
|
|
def asbytes(s):
|
|
if isinstance(s, bytes):
|
|
return s
|
|
return s.encode("latin1")
|
|
|
|
|
|
def asstr(s):
|
|
if isinstance(s, str):
|
|
return s
|
|
return s.decode("latin1")
|
|
|
|
|
|
# list-producing versions of the major Python iterating functions
|
|
def lrange(*args, **kwargs):
|
|
return list(range(*args, **kwargs))
|
|
|
|
|
|
def lzip(*args, **kwargs):
|
|
return list(zip(*args, **kwargs))
|
|
|
|
|
|
def lmap(*args, **kwargs):
|
|
return list(map(*args, **kwargs))
|
|
|
|
|
|
def lfilter(*args, **kwargs):
|
|
return list(filter(*args, **kwargs))
|
|
|
|
|
|
def with_metaclass(meta, *bases):
|
|
"""Create a base class with a metaclass."""
|
|
# This requires a bit of explanation: the basic idea is to make a dummy
|
|
# metaclass for one level of class instantiation that replaces itself with
|
|
# the actual metaclass.
|
|
class metaclass(meta):
|
|
def __new__(cls, name, this_bases, d):
|
|
return meta(name, bases, d)
|
|
|
|
return type.__new__(metaclass, "temporary_class", (), {})
|