class Keeper(object):
def __init__(self, keep):
self.keep = sets.Set(map(ord, keep))
def __getitem__(self, n):
if n not in self.keep:
return None
return unichr(n)
def __call__(self, s):
return unicode(s).translate(self)
makefilter = Keeper
if __name__ == '__main__':
just_vowels = makefilter('aeiouy')
print just_vowels(u'four score and seven years ago')
它会发出“哇哇”的声音。你知道吗
我知道“translate”函数应该接收由创建的表参数字符串.maketrans(). 你知道吗
但是为什么在translate函数中传递“self”。你知道吗
它如何调用getitem函数?你知道吗
在我们讨论您的代码片段之前,让我解释一下
__getitem__
何时为invoke:这就是
__getitem__
所说的:调用
__getitem__: object.__getitem__(self, key)
来实现对self[key]的评估。你知道吗对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于
__getitem__()
方法。如果键的类型不合适,可能会引发TypeError
;如果是序列索引集之外的值(在对负值进行任何特殊解释之后),则应引发IndexError
。对于映射类型,如果缺少键(不在容器中),则应引发KeyError
。你知道吗所以,让我们看看下面的片段:
输出:由于没有定义
__getitem__
方法,所以说does not support indexing
时出错。你知道吗现在让我们更改代码段并添加
__getitem__
以允许对象索引:输出:
所以,当我们使用self作为映射表(即dictionary)时,最后让我们来看一下您的代码片段。默认情况下,它将调用
__getitem__
方法来允许索引以及哪些数字在[97, 101, 105, 111, 117, 121]
范围内。因此,如果数字或ord
值不在集合中,它只返回None,这意味着从unicode字符串中删除。你知道吗以下是一些支持数字索引的内置python对象:
集合索引示例:
让我解释一下unicode翻译部分,我希望你已经知道了,但有些人不知道
这就是
unicode.translate
所说的:需要
table
的可以是字典,即Unicode序数到Unicode序数、Unicode字符串或无的映射。举个例子:从unicode字符串中删除标点:
创建标点到无的映射字典:
使用此
punc_map
翻译unicode字符串以删除标点符号:相关问题 更多 >
编程相关推荐