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ネイティブな関数と勘違いしてハマるところでした。