官方文档中,关于两种方法的说明翻译如下:
string.maketrans(intab, outtab):返回一个translation table,该table定义了intab字符串中的字符到outtab字符串中字符的映射关系,intab与outtab的长度务必相等。
s.translate(table [table,deletechars]):将s中在deletechars中出现过的字符删除,根据给定的table中的映射关系,将字符串中的字符转换,返回字符串s的拷贝。
cookbook中为了对translate方法进行简化,采用了一个返回闭包的工厂函数:
代码如下:
import string
def translator(frm='',to='',delete='',keep=None):
if len(to)==1:
to=to*len(frm)
trans=string.maketrans(frm,to)
if keep is not None:
allchars=string.maketrans('','')
delete=allchars.translate(allchars,keep.translate(allchars,delete))
def translate(s):
return s.translate(trans,delete)
return translate
该函数把各种可能性都封闭在一个简单的接口后面,先解释一下代码,后面再介绍这个返回闭包的工厂函数机制。
参数列表:
frm和to定义了字符串转换映射,delete定义了要删除的字符,keep是要保留的字符。
if keep is not None:
allchars=string.maketrans('','')
delete=allchars.translate(allchars,keep.translate(allchars,delete))
这段代码的逻辑有点绕。
allchars=string.maketrans('','')
allchars表示全体字符。
keep.translate(allchars,delete)
表示从要保留的字符中剔除要delete的字符后,返回剩余字符,即keep-delete。
delete=allchars.translate(allchars,keep.translate(allchars,delete))
表示从全体字符中剔除剩余字符,返回all-(keep-delete),赋值给delete.
以上运算都是集合运算。
最后要返回的translate函数功能为:删除除了keep中所有的字符,如果keep与delete有交集,交集也删除(delete优先);再按照列表转换。
下面简单介绍一下所谓工厂函数:
这里闭包即为里面的内层函数,它之于外层函数是一个本地变量,外层函数好比根据参数定制专门制造里面内层函数的工厂,故称之为工厂函数。