LoginSignup
7
8

More than 5 years have passed since last update.

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

Last updated at Posted at 2018-01-23

背景

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

7
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8