Skip to content

Commit

Permalink
pythongh-96905: In IDLE code, stop redefining built-ins 'dict' and 'o…
Browse files Browse the repository at this point in the history
…bject' (python#114227)

Prefix 'dict' with 'o', 'g', or 'l' for 'object', 'global', or 'local'.
Suffix 'object' with '_'.
  • Loading branch information
terryjreedy authored and kulikjak committed Jan 22, 2024
1 parent 23aba8f commit 4e98d55
Show file tree
Hide file tree
Showing 8 changed files with 45 additions and 42 deletions.
2 changes: 2 additions & 0 deletions Lib/idlelib/News3.txt
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
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
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
@@ -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
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
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
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
@@ -0,0 +1 @@
In idlelib code, stop redefining built-ins 'dict' and 'object'.

0 comments on commit 4e98d55

Please sign in to comment.