def _256_exception_codec(name,exceptions,rexceptions,baseRange=range(32,256)):
import codecs
decoding_map = codecs.make_identity_dict(baseRange)
decoding_map.update(exceptions)
encoding_map = codecs.make_encoding_map(decoding_map)
if rexceptions: encoding_map.update(rexceptions)
### Codec APIs
class Codec(codecs.Codec):
def encode(self,input,errors='strict',charmap_encode=codecs.charmap_encode,encoding_map=encoding_map):
return charmap_encode(input,errors,encoding_map)
def decode(self,input,errors='strict',charmap_decode=codecs.charmap_decode,decoding_map=decoding_map):
return charmap_decode(input,errors,decoding_map)
class StreamWriter(Codec,codecs.StreamWriter):
pass
class StreamReader(Codec,codecs.StreamReader):
pass
C = Codec()
return codecs.CodecInfo(C.encode,C.decode,streamreader=StreamReader,streamwriter=StreamWriter,name=name)
python类make_identity_dict()的实例源码
def python_mapdef_code(varname, map, comments=1, precisions=(2, 4)):
l = []
append = l.append
if "IDENTITY" in map:
append("%s = codecs.make_identity_dict(range(%d))" %
(varname, map["IDENTITY"]))
append("%s.update({" % varname)
splits = 1
del map["IDENTITY"]
identity = 1
else:
append("%s = {" % varname)
splits = 0
identity = 0
mappings = sorted(map.items())
i = 0
key_precision, value_precision = precisions
for mapkey, mapvalue in mappings:
mapcomment = ''
if isinstance(mapkey, tuple):
(mapkey, mapcomment) = mapkey
if isinstance(mapvalue, tuple):
(mapvalue, mapcomment) = mapvalue
if mapkey is None:
continue
if (identity and
mapkey == mapvalue and
mapkey < 256):
# No need to include identity mappings, since these
# are already set for the first 256 code points.
continue
key = hexrepr(mapkey, key_precision)
value = hexrepr(mapvalue, value_precision)
if mapcomment and comments:
append(' %s: %s,\t# %s' % (key, value, mapcomment))
else:
append(' %s: %s,' % (key, value))
i += 1
if i == 4096:
# Split the definition into parts to that the Python
# parser doesn't dump core
if splits == 0:
append('}')
else:
append('})')
append('%s.update({' % varname)
i = 0
splits = splits + 1
if splits == 0:
append('}')
else:
append('})')
return l
def python_mapdef_code(varname, map, comments=1, precisions=(2, 4)):
l = []
append = l.append
if "IDENTITY" in map:
append("%s = codecs.make_identity_dict(range(%d))" %
(varname, map["IDENTITY"]))
append("%s.update({" % varname)
splits = 1
del map["IDENTITY"]
identity = 1
else:
append("%s = {" % varname)
splits = 0
identity = 0
mappings = sorted(map.items())
i = 0
key_precision, value_precision = precisions
for mapkey, mapvalue in mappings:
mapcomment = ''
if isinstance(mapkey, tuple):
(mapkey, mapcomment) = mapkey
if isinstance(mapvalue, tuple):
(mapvalue, mapcomment) = mapvalue
if mapkey is None:
continue
if (identity and
mapkey == mapvalue and
mapkey < 256):
# No need to include identity mappings, since these
# are already set for the first 256 code points.
continue
key = hexrepr(mapkey, key_precision)
value = hexrepr(mapvalue, value_precision)
if mapcomment and comments:
append(' %s: %s,\t# %s' % (key, value, mapcomment))
else:
append(' %s: %s,' % (key, value))
i += 1
if i == 4096:
# Split the definition into parts to that the Python
# parser doesn't dump core
if splits == 0:
append('}')
else:
append('})')
append('%s.update({' % varname)
i = 0
splits = splits + 1
if splits == 0:
append('}')
else:
append('})')
return l