yes or no なプロンプト
先日練習のために書いたTwitterクライアントでポスト前に確認を入れようと思い、yes or noなプロンプトを実装しました。といっても、一通り組んだあと参考になるスクリプトを見つけたので、その引用です。
ソース
引用元は、python-virtinst.noarch パッケージ(RPM)の virtinst/cli.py
def prompt_for_input(prompt = "", val = None): if val is not None: return val print prompt + " ", return sys.stdin.readline().strip() def yes_or_no(s): s = s.lower() if s in ("y", "yes", "1", "true", "t"): return True elif s in ("n", "no", "0", "false", "f"): return False raise ValueError, "A yes or no response is required"
yesな回答がタプルにあればtrue、noな回答がタプルにあればfalse、それ以外は例外を返すような流れですね。s.lower()でcase insensitiveにするところもポイントでしょうか。
使用例
while 1: res = prompt_for_input("Yes or No?") try: if yes_or_no(res): print "yes" else: print "no" break except ValueError, e: print "ERROR: ", e
yesかnoであればbreakでループを抜け、例外であればループの繰り返し。
感想
このyes or noプロンプトはシンプルだけど、プログラミングの練習には意外と効果的かもしれない。
P.S.
今回は該当部分を手直ししましたが、実際はこんな関数が定義されていました。
def _(s) return s
res = prompt_for_input(_("Yes or No?")) のような感じで使われていました。この文字列をごにょごにょ処理するときに使うのでしょうか。てっきりpythonネイティブな関数と勘違いしてハマるところでした。