mirror of
https://github.com/python/cpython.git
synced 2024-11-24 08:52:25 +01:00
gh-96905: In IDLE code, stop redefining built-ins 'dict' and 'object' (#114227)
Prefix 'dict' with 'o', 'g', or 'l' for 'object', 'global', or 'local'. Suffix 'object' with '_'.
This commit is contained in:
parent
8cda72037b
commit
6f4b242a03
@ -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.
|
||||
|
||||
|
@ -508,11 +508,11 @@ class StackViewer(ScrolledList):
|
||||
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
|
||||
@ -533,24 +533,24 @@ class NamespaceViewer:
|
||||
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
|
||||
@ -560,12 +560,12 @@ class NamespaceViewer:
|
||||
# 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:
|
||||
@ -577,7 +577,7 @@ class NamespaceViewer:
|
||||
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()
|
||||
|
@ -125,16 +125,16 @@ class IdbAdapter:
|
||||
|
||||
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):
|
||||
@ -158,20 +158,17 @@ class IdbAdapter:
|
||||
|
||||
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----------
|
||||
|
||||
|
@ -1,3 +1,5 @@
|
||||
"""Define tree items for debug stackviewer, which is only user.
|
||||
"""
|
||||
# XXX TO DO:
|
||||
# - popup menu
|
||||
# - support partial or total redisplay
|
||||
@ -17,9 +19,9 @@ myrepr.maxstring = 100
|
||||
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
|
||||
@ -51,8 +53,8 @@ class ObjectTreeItem(TreeItem):
|
||||
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
|
||||
|
||||
@ -85,8 +87,8 @@ class SequenceTreeItem(ObjectTreeItem):
|
||||
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
|
||||
@ -111,13 +113,13 @@ dispatch = {
|
||||
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 #
|
||||
|
@ -79,6 +79,7 @@ class Get_argspecTest(unittest.TestCase):
|
||||
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'
|
||||
|
@ -158,8 +158,8 @@ class SocketIO:
|
||||
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:
|
||||
|
@ -106,8 +106,8 @@ class VariablesTreeItem(ObjectTreeItem):
|
||||
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
|
||||
|
@ -0,0 +1 @@
|
||||
In idlelib code, stop redefining built-ins 'dict' and 'object'.
|
Loading…
Reference in New Issue
Block a user