これは、プロンプトがsys.stdout.write
またはprint
の代わりに使用されている場合に発生しますraw_input
。次のスクリプトはそれを示しています。
$ cat overwrite.py
import readline, sys
if 'libedit' in readline.__doc__:
readline.parse_and_bind('bind ^I rl_complete')
else:
readline.parse_and_bind('tab: complete')
def set_completer(choices):
choices = sorted(map(str,choices))
def completer(txt, state):
if state == 0:
completer.options = [c for c in choices if c.startswith(txt)]
if state < len(completer.options):
return completer.options[state]
return None
readline.set_completer(completer)
set_completer(['foo','flup'])
sys.stdout.write('input: ')
x = raw_input()
print x
を実行するpython overwrite.py
と、予想されるプロンプト「input:」が表示されます。バックスペースを 1 回押すと、何も削除されません (readline は、既に行頭にあると考えています)。ただし、 「f」を押してからバックスペースを押すと、プロンプトを含む行全体が消去されます。
stdoutに書き込み、ユーザーからの入力を raw_input の呼び出しで取得することを期待しているすべての場所を調べて置き換えなければならないのは非常に不便なので、使用する必要がないことを願っていますraw_input
。Python のドキュメントは、readline に関しては、特徴のないほどまばらです。