Pythonのcmdモジュールで行指向コマンドインタープリタを作る方法
Pythonの標準ライブラリに含まれるcmdモジュールには、Cmdという1つのクラスだけが定義されています。このクラスは、行指向(ラインオリエンテッド)のコマンドラインインタープリタを自作するためのフレームワークの基底クラスとして利用されます。対話型のシェルやCLIツールを手軽に実装したい場合に非常に便利です。
Cmdクラスとは
Cmdクラス、またはそのサブクラスのオブジェクトは、行指向インタープリタの枠組みを提供します。サブクラスが継承する重要なメソッドについて、以下で順に解説します。
cmdloop()メソッド
cmdloop()メソッドを呼び出すと、オブジェクトは対話ループに入り、ユーザーの入力を受け付けて、その内容に応じた適切なコマンドハンドラメソッドへ処理を振り分けます。
ループ開始時には、cmdloop()の引数として渡した導入メッセージが表示されます。プロンプトはデフォルトで「(cmd)」となっていますが、prompt属性を変更することで自由にカスタマイズ可能です。
コマンドの認識の仕組み
インタープリタは、ユーザーからの入力を2つの部分に分解して解釈します。1つ目の部分は「do_」という接頭辞を付けたメソッド名としてクラス内から検索され、2つ目の部分はそのメソッドへの引数として扱われます。
例えば、ユーザーが「hello Python」と入力した場合、インタープリタは「Python」を引数にdo_hello()メソッドの実行を試みます。該当するメソッドが定義されていればそれが実行され、存在しなければエラーメッセージが表示される仕組みです。
自動的に使えるヘルプ機能
Cmdのサブクラスはdo_help()メソッドを自動的に継承します。「help hello」のように入力すると、hello()メソッド内のdocstring(ドキュメント文字列)がヘルプテキストとして表示されます。help_hello()メソッドが別途定義されている場合は、そちらが優先的に実行されます。
実装例:四則演算インタープリタ
次の例では、行指向インタープリタフレームワークの具体的な使い方を紹介します。コードではまずcmdモジュールをインポートし、Cmdクラスのサブクラスを定義しています。
MathOpsクラスには、add(加算)、sub(減算)、mul(乗算)、div(除算)の各メソッド(すべて「do_」接頭辞付き)を、docstringとともに定義しました。
続いてMathOpsクラスのオブジェクトを生成し、cmdloop()メソッドを呼び出して対話ループを開始します。プロンプトに対して「help」と入力すると、ドキュメント化された全メソッド名が一覧表示されます。「help add」のようにメソッド名を指定すれば、対応するdocstringの内容が確認できます。メソッドを呼び出す際は、メソッド名と必要な引数を入力してEnterキーを押すだけです。計算結果が表示された後、再びプロンプトが現れ、「^D」(Ctrl+D)で終了を指示するまでこの流れが繰り返されます。
from cmd import Cmd
class MathOps(Cmd):
def do_add(self, args):
'add two numbers'
num = args.split()
print('addition:', int(num[0]) + int(num[1]))
def do_sub(self, args):
'subtract two numbers'
num = args.split()
print('subtraction:', int(num[0]) - int(num[1]))
def do_mul(self, args):
'multiply two numbers'
num = args.split()
print('multiplication:', int(num[0]) * int(num[1]))
def do_div(self, args):
'perform division'
num = args.split()
print('division:', int(num[0]) / int(num[1]))
def do_EOF(self, args):
return True
op = MathOps()
op.prompt = "->"
op.cmdloop("loop starts. Press ^D to exit")
上記スクリプトの実行例は以下の通りです。
loop starts. Press ^D to exit
->help
Documented commands (type help ):
========================================
add div help mul sub
Undocumented commands:
======================
EOF
->help add
add two numbers
->add 5 7
addition: 12
->div 10 5
division: 2.0
->
>>>
このように、do_接頭辞を持つメソッドを定義するだけで、入力の解析やヘルプ表示、ループ制御といった処理をcmdモジュールが肩代わりしてくれます。独自のCLIツールやデバッグ用コンソールを作りたいときは、ぜひ活用してみてください。
-
Pythonで複素数クラスを定義する方法|四則演算と絶対値の実装例
はじめに本記事では、Pythonで複素数(虚数)を扱うための独自クラス「Complex」を定義し、四則演算や絶対値(モジュラス)の計算を実装する方法を解説します。演算子オーバーロードを活用することで、直感的なコードで複素数を操作できるようになります。実装する機能add():2つの複素数の加算sub():2つの複素数の減算mul():2つの複素数の乗算div():2つの複素数の除算mod():複素数の絶対値(大きさ)を取得複素数は (a + bi) の形式で表示します。2つの複素数に対しこれらの演算を行いますが、クラス内部では add()・sub()・mul()・div() に対応する特殊メソッ
-
PythonでTkinterボタンのコマンド(イベントハンドラ)を動的に変更する方法
TkinterのButtonウィジェットは、アプリケーション内で特定の操作を実行するためのイベントを処理する役割を担っています。こうしたイベントに対応するには、通常、実行したい処理をまとめたメソッド(関数)を定義し、ボタンのcommandオプションに割り当てます。しかし、ボタンを作成した後から、クリック時に実行される処理(イベントメソッド)を変更したい場合もあるでしょう。そんなときに便利なのが、configure(options)メソッドです。このメソッドを使えば、ボタンウィジェットの設定を後から自由に再構成でき、新しいメソッドを定義してボタンに割り当てることで、同じボタンでも状況に応じてまっ