Skip to content

gh-96905: In IDLE code, stop redefining built-ins 'dict' and 'object' #114227

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 5 commits into from
Jan 18, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Lib/idlelib/News3.txt
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,8 @@ Released on 2024-10-xx
=========================


gh-96905: In idlelib code, stop redefining built-ins 'dict' and 'object'.

gh-72284: Improve the lists of features, editor key bindings,
and shell key bingings in the IDLE doc.

Expand Down
28 changes: 14 additions & 14 deletions Lib/idlelib/debugger.py
Original file line number Diff line number Diff line change
Expand Up @@ -508,11 +508,11 @@ def show_source(self, index):
class NamespaceViewer:
"Global/local namespace viewer for debugger GUI."

def __init__(self, master, title, dict=None):
def __init__(self, master, title, odict=None): # XXX odict never passed.
width = 0
height = 40
if dict:
height = 20*len(dict) # XXX 20 == observed height of Entry widget
if odict:
height = 20*len(odict) # XXX 20 == observed height of Entry widget
self.master = master
self.title = title
import reprlib
Expand All @@ -533,24 +533,24 @@ def __init__(self, master, title, dict=None):
canvas["yscrollcommand"] = vbar.set
self.subframe = subframe = Frame(canvas)
self.sfid = canvas.create_window(0, 0, window=subframe, anchor="nw")
self.load_dict(dict)
self.load_dict(odict)

dict = -1
prev_odict = -1 # Needed for initial comparison below.

def load_dict(self, dict, force=0, rpc_client=None):
if dict is self.dict and not force:
def load_dict(self, odict, force=0, rpc_client=None):
if odict is self.prev_odict and not force:
return
subframe = self.subframe
frame = self.frame
for c in list(subframe.children.values()):
c.destroy()
self.dict = None
if not dict:
self.prev_odict = None
if not odict:
l = Label(subframe, text="None")
l.grid(row=0, column=0)
else:
#names = sorted(dict)
###
#
# Because of (temporary) limitations on the dict_keys type (not yet
# public or pickleable), have the subprocess to send a list of
# keys, not a dict_keys object. sorted() will take a dict_keys
Expand All @@ -560,12 +560,12 @@ def load_dict(self, dict, force=0, rpc_client=None):
# interpreter gets into a loop requesting non-existing dict[0],
# dict[1], dict[2], etc from the debugger_r.DictProxy.
# TODO recheck above; see debugger_r 159ff, debugobj 60.
keys_list = dict.keys()
keys_list = odict.keys()
names = sorted(keys_list)
###

row = 0
for name in names:
value = dict[name]
value = odict[name]
svalue = self.repr.repr(value) # repr(value)
# Strip extra quotes caused by calling repr on the (already)
# repr'd value sent across the RPC interface:
Expand All @@ -577,7 +577,7 @@ def load_dict(self, dict, force=0, rpc_client=None):
l.insert(0, svalue)
l.grid(row=row, column=1, sticky="nw")
row = row+1
self.dict = dict
self.prev_odict = odict
# XXX Could we use a <Configure> callback for the following?
subframe.update_idletasks() # Alas!
width = subframe.winfo_reqwidth()
Expand Down
27 changes: 12 additions & 15 deletions Lib/idlelib/debugger_r.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,16 +125,16 @@ def frame_attr(self, fid, name):

def frame_globals(self, fid):
frame = frametable[fid]
dict = frame.f_globals
did = id(dict)
dicttable[did] = dict
gdict = frame.f_globals
did = id(gdict)
dicttable[did] = gdict
return did

def frame_locals(self, fid):
frame = frametable[fid]
dict = frame.f_locals
did = id(dict)
dicttable[did] = dict
ldict = frame.f_locals
did = id(ldict)
dicttable[did] = ldict
return did

def frame_code(self, fid):
Expand All @@ -158,20 +158,17 @@ def code_filename(self, cid):

def dict_keys(self, did):
raise NotImplementedError("dict_keys not public or pickleable")
## dict = dicttable[did]
## return dict.keys()
## return dicttable[did].keys()

### Needed until dict_keys is type is finished and pickealable.
### Needed until dict_keys type is finished and pickleable.
# xxx finished. pickleable?
### Will probably need to extend rpc.py:SocketIO._proxify at that time.
def dict_keys_list(self, did):
dict = dicttable[did]
return list(dict.keys())
return list(dicttable[did].keys())

def dict_item(self, did, key):
dict = dicttable[did]
value = dict[key]
value = reprlib.repr(value) ### can't pickle module 'builtins'
return value
value = dicttable[did][key]
return reprlib.repr(value) # Can't pickle module 'builtins'.

#----------end class IdbAdapter----------

Expand Down
20 changes: 11 additions & 9 deletions Lib/idlelib/debugobj.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
"""Define tree items for debug stackviewer, which is only user.
"""
# XXX TO DO:
# - popup menu
# - support partial or total redisplay
Expand All @@ -17,9 +19,9 @@
myrepr.maxother = 100

class ObjectTreeItem(TreeItem):
def __init__(self, labeltext, object, setfunction=None):
def __init__(self, labeltext, object_, setfunction=None):
self.labeltext = labeltext
self.object = object
self.object = object_
self.setfunction = setfunction
def GetLabelText(self):
return self.labeltext
Expand Down Expand Up @@ -51,8 +53,8 @@ def GetSubList(self):
item = make_objecttreeitem(
str(key) + " =",
value,
lambda value, key=key, object=self.object:
setattr(object, key, value))
lambda value, key=key, object_=self.object:
setattr(object_, key, value))
sublist.append(item)
return sublist

Expand Down Expand Up @@ -85,8 +87,8 @@ def GetSubList(self):
value = self.object[key]
except KeyError:
continue
def setfunction(value, key=key, object=self.object):
object[key] = value
def setfunction(value, key=key, object_=self.object):
object_[key] = value
item = make_objecttreeitem(f"{key!r}:", value, setfunction)
sublist.append(item)
return sublist
Expand All @@ -111,13 +113,13 @@ def keys(self):
type: ClassTreeItem,
}

def make_objecttreeitem(labeltext, object, setfunction=None):
t = type(object)
def make_objecttreeitem(labeltext, object_, setfunction=None):
t = type(object_)
if t in dispatch:
c = dispatch[t]
else:
c = ObjectTreeItem
return c(labeltext, object, setfunction)
return c(labeltext, object_, setfunction)


def _debug_object_browser(parent): # htest #
Expand Down
1 change: 1 addition & 0 deletions Lib/idlelib/idle_test/test_calltip.py
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ class SB: __call__ = None
tiptest(list.append, '(self, object, /)' + append_doc)
tiptest(List.append, '(self, object, /)' + append_doc)
tiptest([].append, '(object, /)' + append_doc)
# The use of 'object' above matches the signature text.

tiptest(types.MethodType,
'(function, instance, /)\n'
Expand Down
4 changes: 2 additions & 2 deletions Lib/idlelib/rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -158,8 +158,8 @@ def debug(self, *args):
s = s + " " + str(a)
print(s, file=sys.__stderr__)

def register(self, oid, object):
self.objtable[oid] = object
def register(self, oid, object_):
self.objtable[oid] = object_

def unregister(self, oid):
try:
Expand Down
4 changes: 2 additions & 2 deletions Lib/idlelib/stackviewer.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,8 +106,8 @@ def GetSubList(self):
value = self.object[key]
except KeyError:
continue
def setfunction(value, key=key, object=self.object):
object[key] = value
def setfunction(value, key=key, object_=self.object):
object_[key] = value
item = make_objecttreeitem(key + " =", value, setfunction)
sublist.append(item)
return sublist
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
In idlelib code, stop redefining built-ins 'dict' and 'object'.