@@ -43,8 +43,7 @@ def unix_getpass(prompt='Password: ', stream=None, *, echochar=None):
4343
4444 Always restores terminal settings before returning.
4545 """
46- if not _is_ascii (echochar ):
47- return ValueError (f"'echochar' must be ASCII, got: { echochar !r} " )
46+ _check_echochar (echochar )
4847
4948 passwd = None
5049 with contextlib .ExitStack () as stack :
@@ -109,8 +108,7 @@ def win_getpass(prompt='Password: ', stream=None, *, echochar=None):
109108 """Prompt for password with echo off, using Windows getwch()."""
110109 if sys .stdin is not sys .__stdin__ :
111110 return fallback_getpass (prompt , stream )
112- if not _is_ascii (echochar ):
113- return ValueError (f"'echochar' must be ASCII, got: { echochar !r} " )
111+ _check_echochar (echochar )
114112
115113 for c in prompt :
116114 msvcrt .putwch (c )
@@ -146,11 +144,12 @@ def fallback_getpass(prompt='Password: ', stream=None):
146144 return _raw_input (prompt , stream )
147145
148146
149- def _is_ascii (echochar ):
147+ def _check_echochar (echochar ):
150148 # ASCII excluding control characters
151- if echochar and (32 <= ord (echochar ) <= 127 ):
152- return True
153- return False
149+ if echochar and not (len (echochar ) == 1 and
150+ echochar .isprintable () and
151+ echochar .isascii ()):
152+ raise ValueError (f"'echochar' must be ASCII, got: { echochar !r} " )
154153
155154
156155def _raw_input (prompt = "" , stream = None , input = None ):
0 commit comments