Python 3.14以降なら、getpass.getpassのキーワード専用引数echo_charへASCIIの*を指定すると、入力内容を見せずに入力した文字数ぶんのアスタリスクを表示できます。Python 3.14の公式日本語ドキュメントにあるとおり、既定値のNoneでは従来どおり何も表示しません。
完成形は「実行中のPythonを確認する」「echo_charが使えることを確かめる」「通常の端末で最小コードを動かす」の順です。標準ライブラリだけで完結するため、別パッケージの導入は不要です。
実際に動いているPython 3.14か確認する
インストール済みの版、PATHの表示、IDEの設定画面だけではなく、そのコードを実行しているPython自身を確認します。次のコードは、実行版とgetpass.getpassのシグネチャだけを表示し、秘密情報は扱いません。
import getpass
import inspect
import sys
print(sys.version)
print(inspect.signature(getpass.getpass))
sys.versionが3.14以降で、表示されたシグネチャにecho_charが含まれていれば、この引数を使える実行環境です。3.14をインストールしていても、IDEや仮想環境が別のPythonを選んでいることがあるため、ここで見えた結果を基準にします。
アスタリスクを表示する最小コード
from getpass import getpass
password = getpass('パスワード: ', echo_char='*')
print('入力を受け付けました。')
入力した値はpasswordへ入りますが、この例は値そのもの、repr、文字数、ログを出力しません。画面には入力の手応えとして*が表示され、Enterで入力が確定します。
echo_charへ指定できるのは、1文字のprintable ASCIIです。使うのは半角ASCIIの*であり、全角の「*」、黒丸の「●」、**のような複数文字は同じ指定として扱えません。制約は英語版の公式ドキュメントでも確認できます。
古いPythonでTypeErrorになるとき
unexpected keyword argumentを含むTypeErrorが出た場合は、まず前の確認コードを同じ実行方法で動かします。echo_charはPython 3.14で追加されたため、3.13以前のgetpass.getpassへ同じ引数を渡すことはできません。
- 実行中の
sys.versionが3.14以降か確認します。 - 実際の関数シグネチャに
echo_charがあるか確認します。 - なければ、3.14以降を使う実行設定へ直すか、
echo_charを付けない従来の無表示入力へ戻します。
エディターの表示だけを見て「3.14のはず」と判断せず、端末、IDE、仮想環境ごとに選ばれている実行ファイルを切り分けるのが確実です。
端末ごとの差を順番に切り分ける
1. まず普通の端末で試す
最初は、対話入力を扱える通常の端末から実行します。標準入力をファイルやパイプへつないだ環境などでは、同じように安全な非表示入力ができると決めつけないでください。端末から直接起動した場合と結果を比べると、コードと実行環境の問題を分けやすくなります。
2. IDEとIDLEの入力先を確認する
IDLEでは、入力欄がIDLEの画面内ではなく、IDLEを起動した端末側へ出る場合があります。入力待ちに見えるのにIDE側へ何も出ないときは、起動元の端末を確認し、必要なら通常の端末から同じファイルを実行します。なお、WASIではgetpassを利用できません。
3. GetPassWarningを見落とさない
非表示入力を利用できない場合、getpassはGetPassWarningを出し、標準入力へフォールバックします。警告だけを消しても、安全な非表示入力が実現したことにはなりません。警告が出た環境では、秘密を入力する前に実行場所と標準入出力を見直します。詳細は公式日本語ドキュメントの注意事項を確認してください。
4. Unixでは編集キーの違いに注意する
Unix系環境でecho_charを設定すると、端末は非canonicalモードになります。そのため、Ctrl+Uなど通常の行編集が働かず、意図しない文字が入力へ混ざる場合があります。入力をやり直すときは、普段の編集キーが使える前提にせず、端末上の挙動を確かめてください。
アスタリスク表示は暗号化ではない
画面上の*は、入力中の文字を見せないための表示です。関数の返り値や、その後の保存先を暗号化する機能ではありません。受け取った値を画面へ出さず、デバッグ出力、例外メッセージ、アクセスログ、操作ログへも混ぜないように扱います。
よくある質問
全角の「*」や「●」でもマスクできますか
同じ指定としては使えません。echo_charは1文字のprintable ASCIIに限られるため、半角ASCIIの*を指定します。見た目が似ていても、全角記号や黒丸は別の文字です。
Python 3.14を入れたのにTypeErrorが出るのはなぜですか
実際にコードを動かしているPythonが別版である可能性があります。最初の確認コードでsys.versionと関数シグネチャを同じ実行経路から調べ、echo_charが見えない場合はIDEや仮想環境の実行設定を修正します。
Python 3.14の別の追加機能を確認する場合は、argparseの候補表示が出ないときの確認方法も参考になります。


コメント