Python Udemy講座 Jarvisのカスタマイズ

Python学習【365日チャレンジ!】117日目のマスターU(@Udemy11)です。

Amazonプライムにハマっていることはちょくちょく紹介していますが、歴史物の映画をみてしまうと、ついつい他の歴史物がみたくなってしまいます。

JIN-仁-は、幕末にタイムスリップする脳外科医のドラマですべて見終えるのに寝不足になってしまいました。

その後は、Dr.STONEで、歴史とは全く関係がないものの、科学の話が面白すぎて24エピソードをすべて見てしまい、これまた寝不足。

その次は、関ヶ原を見て、清州会議、桜田門外の変と続けてみてしまいました。

ほんと、Amazonプライムのせいで寝不足続きです。

魅力的な映画がたくさんあるのでほんと困っちゃうくらいAmazonプライムはおすすめです!

それでは、今日もPython学習をはじめますよ!

昨日の復習

昨日は、対話アプリJarvisのMVCモデルが完成し、実際に動いているプログラムの動画を撮影して、Youtuberデビューをはたしました。

最初は、一つのファイルにすべてを詰め込んで作ったJarvisですが、パーツに分けることによって、それぞれの役割の部分だけ変更することで、不意に他のコードを変更するリスクを回避することができました。

実際にJarvisを動かしている動画もあるので、昨日の記事を参考に復習してみてください。

今日は、ちょっとしたカスタマイズをしてみようと思います。

追加する会話

追加する会話は

このエントリーで紹介している、2人目以降のJarvisがすすめるスポーツが好きかどうかを尋ねるやり取りの際の注意書きにいれていたもので、回答がYesでもNoでもない場合に次の文章を表示させるコードです。

JarvisJarvis

Yes か Noで答えてください。

テンプレートを用意して、コードを少し変更することでこの会話を表示させることができます。

変更するファイルは、console.pyrobot.pyで、新しい文章ファイルをtemplatesフォルダに追加します。

askagain.txt

Jarvisがおすすめのスポーツが好きかどうかを尋ねた時、YesNo以外の入力をした場合は、Whileループでもう一度同じ質問を繰り返しました。

このときユーザーに、どう答えてほしいかを伝えることで、次の入力の際に、きちんとYesNoで答えてもらえるようになります。

追加するテキストファイルaskagain.txtの中身は次のようにします。

'Yes'か'No'でお答えください。

次に、このテキストファイルを読み込んで整形するためのconsole.pyのコードを変更します。

console.py

基本は関数を一つ追加しますが、get_templateメソッドと同じ内容でフォーマットを少し変更します。

def get_other_template(template_file_path):
    template = find_template(template_file_path)
    with open(template, 'r', encoding='utf-8') as template_file:
        contents = template_file.read()
        contents = contents.rstrip(os.linesep)
        contents = '{splitter}{sep}{contents}{sep}'.format(
            contents=contents, splitter="/" * 40, sep=os.linesep)
        return string.Template(contents)

テンプレートの文章の上下を/で装飾していたものを上部だけの装飾に変更しています。

そのままget_templateメソッドを活用してもいいのですが、/の装飾が少し目立ってしまうので、専用のメソッドget_other_templateを作ってみました。

robot.py

最後に変更するのは、robot.pyです。

こちらの記事で記述しているコードの55行目からのコードを次のように変更しました。

elif is_yes.upper() == 'N' or is_yes.upper() == 'NO':
    new_recommend_sport = self.ranking_model.get_most_popular(not_list=finish_recommend_sports)
    if not new_recommend_sport:
        break
    finish_recommend_sports.append(new_recommend_sport)

else:
    other_template = console.get_other_template('askagain.txt')
    print(other_template.substitute())
    continue

Noの回答の場合のif文をelifに変更し、else文を加えてYesでもNoでもない場合の処理を追加しました。

consoleモジュールの新しく追加したget_other_templateの引数にaskagain.txtを代入したあと、substitude()をつかって整形したテンプレートを出力しました。

これで、YesでもNoでもない回答をしたときは、次のように表示されます

////////////////////////////////////////
'Yes'か'No'でお答えください。

////////////////////////////////////////
私のおすすめのスポーツはは、【スポーツ名】です。
このスポーツは好きですか? [Yes/No]
////////////////////////////////////////

これで今回の改良は完成です。

完成したJarvisのコードはこちらからダウンロード可能なので、必要な方はどうぞ。

改良版Jarvis

Pythonistaでの動画だと縦長になってしまうので、今回改良したJarvisは、Pycharmでの動画にしてみました。

ranking.csvが存在しない状態から、4人の人が質問に答えるまでを動画にしています。

途中のおすすめのスポーツが好きかどうか尋ねる質問では、YesNo以外の回答をした際に、追加した返答ができるようになっています。

シングルリソースマルチユース

プログラミングに限ったことではありませんが、一度作ったものは、どんどん活用していくことが必要です。

同じコードを使えば、1からコードを書く必要がなくなるので、時間短縮になるうえ、他の人にも使えるようにすることで、開発や利用シーンがが一気に広がっていきます。

その最たるものが標準ライブラリであり、サードパーティーライブラリです。

便利なものが自由に使えれば、多くの人が利用して新たなアイデアが生まれます。

例えば、QRコードは、デンソーウェーブが商標登録していますが、オープンソース化することで様々な場面で利用され、今や電子決済には欠かすことのできない技術になっています。

もともと社内の部品管理のために開発された技術ですが、経費をかけて開発しているので、他社で利用するには、使用料を取るのが当たり前です。

しかし、より多くの人がこの技術を使えるようにとの想いから、QRコードはオープンソース化され、誰もが自由に使うことができるようになっています。

もし、QRコードをオープンソースにしていなければ、ここまで普及することはなかったでしょう。

同じように、Pythonでは利便性の高いライブラリは無料で使うことができますし、サードパーティーもどんどんと増えています。

便利なものを利用しないのは、目の前に用意された食事を食べないのと一緒です。

自分で書いたコードはもちろんのこと、すでに利用できるソースがあるのなら、マルチに利用して、利便性を高めた作業をすすめていきましょう!

それでは、明日もGood Python!