@@ -364,14 +364,6 @@ def __init__(self, completekey='tab', stdin=None, stdout=None, skip=None,
364
364
except ImportError :
365
365
pass
366
366
367
- # GH-138860
368
- # We need to lazy-import rlcompleter to avoid deadlock
369
- # We cannot import it during self.complete* methods because importing
370
- # rlcompleter for the first time will overwrite readline's completer
371
- # So we import it here and save the Completer class
372
- from rlcompleter import Completer
373
- self .RlCompleter = Completer
374
-
375
367
self .allow_kbdint = False
376
368
self .nosigint = nosigint
377
369
# Consider these characters as part of the command so when the users type
@@ -1100,6 +1092,31 @@ def set_convenience_variable(self, frame, name, value):
1100
1092
# Generic completion functions. Individual complete_foo methods can be
1101
1093
# assigned below to one of these functions.
1102
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
+
1103
1120
def completenames (self , text , line , begidx , endidx ):
1104
1121
# Overwrite completenames() of cmd so for the command completion,
1105
1122
# if no current command matches, check for expressions as well
@@ -1196,7 +1213,7 @@ def completedefault(self, text, line, begidx, endidx):
1196
1213
1197
1214
state = 0
1198
1215
matches = []
1199
- completer = self .RlCompleter (self .curframe .f_globals | self .curframe .f_locals )
1216
+ completer = self .rlcompleter (self .curframe .f_globals | self .curframe .f_locals )
1200
1217
while (match := completer .complete (text , state )) is not None :
1201
1218
matches .append (match )
1202
1219
state += 1
@@ -1211,7 +1228,7 @@ def _enable_rlcompleter(self, ns):
1211
1228
return
1212
1229
1213
1230
try :
1214
- completer = self .RlCompleter (ns )
1231
+ completer = self .rlcompleter (ns )
1215
1232
old_completer = readline .get_completer ()
1216
1233
readline .set_completer (completer .complete )
1217
1234
yield
0 commit comments