はじめに
どうもMizokeiです。
プログラミングをしていると、プログラムにさまざまな思いをのせて書く人もいるようです。クラスやメソッドなどを人に見立てて書いてみたり、ストーリー仕立てに書いてみたり・・・。
おおよそネタな話ですが、今日はPythonの標準ライブラリにあるロギングを使って、RPG風なクラスを作ってみました。プログラム自体が英語のようなものなので、書き方によっては、文ぽくも書けそうですよね。
魔法使いが呪文を唱えるように、ログを出力させてみるのも一興です。さて、実行環境です。
実行環境
- Windows10 64bit
- Python 3.7
ロギング機能を使いました
今回は、以下のロギング機能を使用しました。リンク先のバージョンはPython 3.7ですが、ご自身の環境に合わせてご確認くださいませ。
ロギングクラスをimport
ロギング機能を使用するには、以下のimport文を挿入します。
0 1 2 3 |
#ロギング import logging |
標準ライブラリのため、すでにインストールされていると思いますが、実行時に見つからない、エラーとなる際には、インストールしているバージョンをご確認のうえ、pythonそのものの再インストールをお試しください。
「調査者」と名付けてみる
さて、本題です。RPG風とはいえ、流石にロギングに魔法使いはなにか違う感じがします。今回は、ログを調査して出力してくれる、という意味で、調査者と名付けてみました。
なので、クラス名は、Investigator(=「調査者」)です。
0 1 2 3 |
#調査者クラス class Investigator() |
コンストラクタの定義
次にコンストラクタですね。ネタ記事なので、ロギングそのものの説明は割愛します。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
#コンストラクタ def __init__(self, logger_name): """ Investigatorクラスのコンストラクタ。 ロガーを初期化する。 Parameters ---------- logger_name : str ロガーの名前。 Result ---------- なし """ # ロガーインスタンス self.LOGGER = logging.getLogger(logger_name) self.LOGGER.setLevel(logging.DEBUG) # ハンドラインスタンス ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # フォーマッタを定義 formatter = logging.Formatter( fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y/%m/%d %I:%M:%S') # フォーマッタをハンドラに追加 ch.setFormatter(formatter) # ハンドラをロガーに追加 self.LOGGER.addHandler(ch) |
ロギングレベルごとのメソッド
ロギングのレベルごとにそれぞれのメソッドを用意しますね。ここで、「調査者は○○を唱えた!」風に使って見たいと思います。←結局魔法使い扱いやんけ
ロギングレベルは以下の6つですが、最後のNOTSETは無視して、5つほど作ってみます。
レベル | 数値 |
---|---|
CRITICAL | 50 |
ERROR | 40 |
WARNING | 30 |
INFO | 20 |
DEBUG | 10 |
NOTSET | 0 |
pydoc風記載のため少し長いですが、メソッドそのものは1行です。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 |
#デバッグ def recite_debug_message(self, message): """ デバッグレベル出力用メソッド。 ロギングのレベルDEBUGを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.debug(message) #情報 def recite_information_message(self, message): """ 情報レベル出力用メソッド。 ロギングのレベルINFOを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.info(message) #警告 def recite_warning_message(self, message): """ 警告レベル出力用メソッド。 ロギングのレベルWARNINGを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.warning(message) #エラー def recite_error_message(self, message): """ エラーレベル出力用メソッド。 ロギングのレベルERRORを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.error(message) #重大 def recite_critical_message(self, message): """ 重大レベル出力用メソッド。 ロギングのレベルCRITICALを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.critical(message) |
使ってみる
調査者クラスInvestigatorのインスタンスを作ります。引数に名前を付けることができるのでそのまま「investigator」で入れました。
0 1 2 3 |
#調査者インスタンスを作成 investigator = Investigator('investigator') |
以下のメソッドで呼出します。今回は、ロギングレベルはINFOです。
0 1 2 3 |
#調査者インスタンスが唱える investigator.recite_information_message('これは情報ですよ。') |
investigator.recite_information_messageメソッドで実行していますが、investigator recite information messageとそのまま英語になっていますね!←まあそれを意図したんですが
Google翻訳さんに渡すと・・・
0 1 2 |
調査員は情報メッセージを暗唱します。 |
あら。日本語→英語で詠唱します、唱えますでGoogle翻訳さんから使いましたが、英語→日本語で暗唱しますになっちゃいましたね笑。
まあ、そのあたりはご愛嬌で。
ログ出力を確認してみる・・・
ログもちゃんと出ています。名付けた「investigator 」も出力されていますね。いい感じです。
0 1 2 |
2020/02/04 10:48:14 - investigator - INFO - これは情報ですよ。 |
ソースコード全文
さて、今回作ったpythonコードの全文です。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 |
# -*- coding: utf-8 -*- ''' ロギングを人に見立ててみる。 ''' # #標準ライブラリ # #ロギング import logging #調査者クラス class Investigator(): """ ロガーの情報を保持する。 Attributes ---------- LOGGER : object ロガーインスタンス。 """ #コンストラクタ def __init__(self, logger_name): """ Investigatorクラスのコンストラクタ。 ロガーを初期化する。 Parameters ---------- logger_name : str ロガーの名前。 Result ---------- なし """ # ロガーインスタンス self.LOGGER = logging.getLogger(logger_name) self.LOGGER.setLevel(logging.DEBUG) # ハンドラインスタンス ch = logging.StreamHandler() ch.setLevel(logging.DEBUG) # フォーマッタを定義 formatter = logging.Formatter( fmt='%(asctime)s - %(name)s - %(levelname)s - %(message)s', datefmt='%Y/%m/%d %I:%M:%S') # フォーマッタをハンドラに追加 ch.setFormatter(formatter) # ハンドラをロガーに追加 self.LOGGER.addHandler(ch) #デバッグ def recite_debug_message(self, message): """ デバッグレベル出力用メソッド。 ロギングのレベルDEBUGを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.debug(message) #情報 def recite_information_message(self, message): """ 情報レベル出力用メソッド。 ロギングのレベルINFOを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.info(message) #警告 def recite_warning_message(self, message): """ 警告レベル出力用メソッド。 ロギングのレベルWARNINGを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.warning(message) #エラー def recite_error_message(self, message): """ エラーレベル出力用メソッド。 ロギングのレベルERRORを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.error(message) #重大 def recite_critical_message(self, message): """ 重大レベル出力用メソッド。 ロギングのレベルCRITICALを出力する。 Parameters ---------- message : str 出力するログメッセージ。 Result ---------- なし """ self.LOGGER.critical(message) #メイン処理 if __name__ == '__main__': #調査者インスタンスを作成 investigator = Investigator('investigator') #調査者インスタンスが唱える investigator.recite_information_message('これは情報ですよ。') |
プログラムを書きつつ、一つのストーリーを作ってみるのも面白いかもしれませんね。
この記事が誰かの参考になれば幸いです。それでは、また。
関連記事
【Python】ピクセル値を操作して画像を作成してみよう【画像処理】
【Python×業務自動化】Excelを起動する【RPA】
【Python超入門】クラスを作成してみよう