Python

特殊メソッド__missing__を使ってLeetを変換

背景

Pythonでコンストラクタは__init__を呼び出す. このようなメソッドのことを, 特殊メソッドとよび、例えば演算子オーバーロードなどが実現できる. ここでは, __missing__を使ってLeetをやってみる.

特殊メソッド`__missing__'

まずはドキュメントより。

object.__missing__(self, key)
self[key] の実装において辞書内にキーが存在しなかった場合に、 dict のサブクラスのために dict.__getitem__() によって呼び出されます。
Python言語 リファレンス 3.データモデルより引用
https://docs.python.jp/3.5/reference/datamodel.html

つまり, 辞書内にキーがない場合に呼び出される特殊メソッドである. 実例がないとよくわからないし, 実装してみないと身にならないので, Leetで使ってみる.

Leet

Wikipediaより

leet(リート、1337l33t)は、主に英語圏においてインターネット上で使われるアルファベットの表記法である。leetspeak(リートスピーク)とも呼ばれる。
Wikipedia Leetより引用
https://ja.wikipedia.org/wiki/Leet

例えばAは4, BはI3, Sは5というように変換する.

ここでは, 定義された文字だけLeetにして, ほかはそのまま返すようにする. つまり,

O='0', I='1', S='5', T='7', E='3'

と定義すると,

「NOW IS THE TIME」 = 「N0W 15 7H3 71M3」

と変換するようにする.

解答例

class LeetDict(dict):
    def __missing__(self, key):
        return key

leet_dict = LeetDict(
    O='0',
    I='1',
    S='5',
    T='7',
    E='3',
)

question = 'NOW IS THE TIME'
question_list = list(question) # リストにしなくてもOK(shiracamusさんありがとう!)

answer_list =  [leet_dict[k] for k in question_list]

print(''.join(answer_list)) # N0W 15 7H3 71M3

参考

http://diveintopython3-ja.rdy.jp/special-method-names.html