何かを書き留める何か

数学や読んだ本について書く何かです。最近は社会人として生き残りの術を学ぶ日々です。

PythonicではなくPythonesqueなクラスを書く その2

It’s…

youtu.be

最近、いかに役に立たないプログラムを書くかということを考えている。 世の中では企業が自社の開発の成果の一部をオープンソースとして切り出してたくさんの人に使われている。 そうすると自分も何か公開するには何か役に立つものを公開しなくてはいけないのではないか、という強迫概念に囚われてしまう。 業務では業務のプログラムを書いているので、ここでは何も役に立たないプログラミングをしてみたい。

今回は、Pythonesqueなクラスとして毎回変化する文字列のクラスを実装する。 文字列が評価されるたびに内部で書き換わるという役に立たない代物である。 現在のPythonではstrを直接継承してクラスを実装することが可能であるが、collections.UserStringを継承するほうがイタズラがしやすいと思われる。

import collections
import random
import string


class StrangeString(collections.UserString):


    def __str__(self):
        self.data = "".join([random.choice(string.ascii_letters) for _ in range(random.randint(1, 10))])
        return str(self.data)


if __name__ == "__main__":
    s = StrangeString("abc")
    for _ in range(10):
        print(s, s.upper(), s.lower())

実行結果は以下のとおりである。 実装からわかるように結果はランダムに変化する。

GCPp UAaiHZoGk UaTvs
ZoBIW olrixlE FUfCS
GTR S Itsq
CImAlqaHY ZBNY JoYBhYe
wdNtMJIAa EvQgkA oSfSRkj
DfwsTVxuaT cRZRtmOl BRKZjSav
GZW jcXG bpw
GpeN ecM EbwyaDsqK
naU rpRCnwhe vP
ZCD tK vqwJrSHkg

なるほど無秩序な結果となったが、無秩序な中にも秩序を求めたい。 s.upper()としたら結果が毎回ランダムになろうとも大文字になって欲しい。s.title()はタイトルであるべきだ。