100
100
import _pyrepl .utils
101
101
102
102
from contextlib import ExitStack , closing , contextmanager
103
- from rlcompleter import Completer
104
103
from types import CodeType
105
104
from warnings import deprecated
106
105
@@ -364,6 +363,7 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
364
363
readline .set_completer_delims (' \t \n `@#%^&*()=+[{]}\\ |;:\' ",<>?' )
365
364
except ImportError :
366
365
pass
366
+
367
367
self .allow_kbdint = False
368
368
self .nosigint = nosigint
369
369
# Consider these characters as part of the command so when the users type
@@ -1092,6 +1092,31 @@ def set_convenience_variable(self, frame, name, value):
1092
1092
# Generic completion functions. Individual complete_foo methods can be
1093
1093
# assigned below to one of these functions.
1094
1094
1095
+ @property
1096
+ def rlcompleter (self ):
1097
+ """Return the `Completer` class from `rlcompleter`, while avoiding the
1098
+ side effects of changing the completer from `import rlcompleter`.
1099
+
1100
+ This is a compromise between GH-138860 and GH-139289. If GH-139289 is
1101
+ fixed, then we don't need this and we can just `import rlcompleter` in
1102
+ `Pdb.__init__`.
1103
+ """
1104
+ if not hasattr (self , "_rlcompleter" ):
1105
+ try :
1106
+ import readline
1107
+ except ImportError :
1108
+ # readline is not available, just get the Completer
1109
+ from rlcompleter import Completer
1110
+ self ._rlcompleter = Completer
1111
+ else :
1112
+ # importing rlcompleter could have side effect of changing
1113
+ # the current completer, we need to restore it
1114
+ prev_completer = readline .get_completer ()
1115
+ from rlcompleter import Completer
1116
+ self ._rlcompleter = Completer
1117
+ readline .set_completer (prev_completer )
1118
+ return self ._rlcompleter
1119
+
1095
1120
def completenames (self , text , line , begidx , endidx ):
1096
1121
# Overwrite completenames() of cmd so for the command completion,
1097
1122
# if no current command matches, check for expressions as well
@@ -1186,10 +1211,9 @@ def completedefault(self, text, line, begidx, endidx):
1186
1211
conv_vars = self .curframe .f_globals .get ('__pdb_convenience_variables' , {})
1187
1212
return [f"${ name } " for name in conv_vars if name .startswith (text [1 :])]
1188
1213
1189
- # Use rlcompleter to do the completion
1190
1214
state = 0
1191
1215
matches = []
1192
- completer = Completer (self .curframe .f_globals | self .curframe .f_locals )
1216
+ completer = self . rlcompleter (self .curframe .f_globals | self .curframe .f_locals )
1193
1217
while (match := completer .complete (text , state )) is not None :
1194
1218
matches .append (match )
1195
1219
state += 1
@@ -1204,8 +1228,8 @@ def _enable_rlcompleter(self, ns):
1204
1228
return
1205
1229
1206
1230
try :
1231
+ completer = self .rlcompleter (ns )
1207
1232
old_completer = readline .get_completer ()
1208
- completer = Completer (ns )
1209
1233
readline .set_completer (completer .complete )
1210
1234
yield
1211
1235
finally :
0 commit comments