下面是源码:
l = map(chr, xrange(256))#生成一个ascii字符列表
_idmap = str('').join(l)#转化成字符串
del l
_idmapL = None
def maketrans(fromstr, tostr):
"""maketrans(frm, to) -> string Return a translation table (a string of 256 bytes long) suitable for use in string.translate. The strings frm and to must be of the same length. """
if len(fromstr) != len(tostr):
raise ValueError, "maketrans arguments must have same length"
global _idmapL
if not _idmapL:
_idmapL = list(_idmap)
L = _idmapL[:]#这里用L = _idmapL[:]使得L为 _idmapL的浅拷贝,从而我们对L的操作不会影响到_idmapL,可以复用_idmapL
fromstr = map(ord, fromstr)
for i in range(len(fromstr)):
L[fromstr[i]] = tostr[i]
return ''.join(L)
#这部分做了一一对应,将原本ascii编码表相应的位置做了替换比如maketrans('a','b'),这部分的执行过程便是这样:转化'a',找到'a'在ascii#的位置ord('a')=97,用'b'替换ascii码表中97位置为'b',即L[96]='b',然后返回更新后的ascii码表
总结:maketrans替换的ascii码表中的值,所以它能处理的范围也只能在ascii包含的字符内,中文是不行的,如果想把这个功能用于中文的话,可以参照思路做一个utf8的maketrans。不过生成的映射表长度变了,不知道ranslate能不能使用,如果不行,还要继承string类,覆盖原来的translate函数,或者直接改源码。现在从python官方文档可以读到内建模块的源码,但是找不到内建类型和函数的源码,如果有人知道,望告知,多谢!