summaryrefslogtreecommitdiffstats
path: root/Lib/idlelib
diff options
context:
space:
mode:
authorTerry Jan Reedy <tjreedy@udel.edu>2023-10-18 08:14:52 (GMT)
committerGitHub <noreply@github.com>2023-10-18 08:14:52 (GMT)
commitbaefbb21d91db2d950706737a6ebee9b2eff5c2d (patch)
treeb667e758572b247d244afddd11fcdcb4d3466106 /Lib/idlelib
parent77dbd956090aac66e264d9d640f6adb6b0930b87 (diff)
downloadcpython-baefbb21d91db2d950706737a6ebee9b2eff5c2d.zip
cpython-baefbb21d91db2d950706737a6ebee9b2eff5c2d.tar.gz
cpython-baefbb21d91db2d950706737a6ebee9b2eff5c2d.tar.bz2
gh-103737: IDLE - Remove unneeded .keys() for dict iteration (#110960)
Add comments where .keys() is needed. Leave debugger usages along because situation is unclear as indicated in expanded comment. Most testing is manual.
Diffstat (limited to 'Lib/idlelib')
-rw-r--r--Lib/idlelib/config.py10
-rw-r--r--Lib/idlelib/configdialog.py22
-rw-r--r--Lib/idlelib/debugger.py2
-rw-r--r--Lib/idlelib/debugobj.py3
-rw-r--r--Lib/idlelib/idle_test/test_config.py4
-rw-r--r--Lib/idlelib/idle_test/test_debugobj.py4
-rwxr-xr-xLib/idlelib/pyshell.py7
-rw-r--r--Lib/idlelib/stackviewer.py2
8 files changed, 28 insertions, 26 deletions
diff --git a/Lib/idlelib/config.py b/Lib/idlelib/config.py
index 2b09d79..898efeb 100644
--- a/Lib/idlelib/config.py
+++ b/Lib/idlelib/config.py
@@ -597,7 +597,9 @@ class IdleConf:
problem getting any core binding there will be an 'ultimate last
resort fallback' to the CUA-ish bindings defined here.
"""
+ # TODO: = dict(sorted([(v-event, keys), ...]))?
keyBindings={
+ # vitual-event: list of key events.
'<<copy>>': ['<Control-c>', '<Control-C>'],
'<<cut>>': ['<Control-x>', '<Control-X>'],
'<<paste>>': ['<Control-v>', '<Control-V>'],
@@ -880,7 +882,7 @@ def _dump(): # htest # (not really, but ignore in coverage)
line, crc = 0, 0
def sprint(obj):
- global line, crc
+ nonlocal line, crc
txt = str(obj)
line += 1
crc = crc32(txt.encode(encoding='utf-8'), crc)
@@ -889,7 +891,7 @@ def _dump(): # htest # (not really, but ignore in coverage)
def dumpCfg(cfg):
print('\n', cfg, '\n') # Cfg has variable '0xnnnnnnnn' address.
- for key in sorted(cfg.keys()):
+ for key in sorted(cfg):
sections = cfg[key].sections()
sprint(key)
sprint(sections)
@@ -908,4 +910,6 @@ if __name__ == '__main__':
from unittest import main
main('idlelib.idle_test.test_config', verbosity=2, exit=False)
- # Run revised _dump() as htest?
+ _dump()
+ # Run revised _dump() (700+ lines) as htest? More sorting.
+ # Perhaps as window with tabs for textviews, making it config viewer.
diff --git a/Lib/idlelib/configdialog.py b/Lib/idlelib/configdialog.py
index cda7966..d56afe8 100644
--- a/Lib/idlelib/configdialog.py
+++ b/Lib/idlelib/configdialog.py
@@ -211,14 +211,8 @@ class ConfigDialog(Toplevel):
contents=help_common+help_pages.get(page, ''))
def deactivate_current_config(self):
- """Remove current key bindings.
- Iterate over window instances defined in parent and remove
- the keybindings.
- """
- # Before a config is saved, some cleanup of current
- # config must be done - remove the previous keybindings.
- win_instances = self.parent.instance_dict.keys()
- for instance in win_instances:
+ """Remove current key bindings in current windows."""
+ for instance in self.parent.instance_dict:
instance.RemoveKeybindings()
def activate_config_changes(self):
@@ -227,8 +221,7 @@ class ConfigDialog(Toplevel):
Dynamically update the current parent window instances
with some of the configuration changes.
"""
- win_instances = self.parent.instance_dict.keys()
- for instance in win_instances:
+ for instance in self.parent.instance_dict:
instance.ResetColorizer()
instance.ResetFont()
instance.set_notabs_indentwidth()
@@ -583,6 +576,8 @@ class HighPage(Frame):
(*)theme_message: Label
"""
self.theme_elements = {
+ # Display_name: ('internal_name, sort_number').
+ # TODO: remove sort_number unneeded with dict ordering.
'Normal Code or Text': ('normal', '00'),
'Code Context': ('context', '01'),
'Python Keywords': ('keyword', '02'),
@@ -765,7 +760,7 @@ class HighPage(Frame):
self.builtinlist.SetMenu(item_list, item_list[0])
self.set_theme_type()
# Load theme element option menu.
- theme_names = list(self.theme_elements.keys())
+ theme_names = list(self.theme_elements)
theme_names.sort(key=lambda x: self.theme_elements[x][1])
self.targetlist.SetMenu(theme_names, theme_names[0])
self.paint_theme_sample()
@@ -1477,12 +1472,13 @@ class KeysPage(Frame):
reselect = True
list_index = self.bindingslist.index(ANCHOR)
keyset = idleConf.GetKeySet(keyset_name)
- bind_names = list(keyset.keys())
+ # 'set' is dict mapping virtual event to list of key events.
+ bind_names = list(keyset)
bind_names.sort()
self.bindingslist.delete(0, END)
for bind_name in bind_names:
key = ' '.join(keyset[bind_name])
- bind_name = bind_name[2:-2] # Trim off the angle brackets.
+ bind_name = bind_name[2:-2] # Trim double angle brackets.
if keyset_name in changes['keys']:
# Handle any unsaved changes to this key set.
if bind_name in changes['keys'][keyset_name]:
diff --git a/Lib/idlelib/debugger.py b/Lib/idlelib/debugger.py
index 452c62b..a92bb98 100644
--- a/Lib/idlelib/debugger.py
+++ b/Lib/idlelib/debugger.py
@@ -509,7 +509,7 @@ class NamespaceViewer:
# There is also an obscure bug in sorted(dict) where the
# 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()
names = sorted(keys_list)
###
diff --git a/Lib/idlelib/debugobj.py b/Lib/idlelib/debugobj.py
index 71d01c7..032b686 100644
--- a/Lib/idlelib/debugobj.py
+++ b/Lib/idlelib/debugobj.py
@@ -93,7 +93,8 @@ class SequenceTreeItem(ObjectTreeItem):
class DictTreeItem(SequenceTreeItem):
def keys(self):
- keys = list(self.object.keys())
+ # TODO return sorted(self.object)
+ keys = list(self.object)
try:
keys.sort()
except:
diff --git a/Lib/idlelib/idle_test/test_config.py b/Lib/idlelib/idle_test/test_config.py
index 08ed76f..a746f15 100644
--- a/Lib/idlelib/idle_test/test_config.py
+++ b/Lib/idlelib/idle_test/test_config.py
@@ -274,8 +274,8 @@ class IdleConfTest(unittest.TestCase):
conf.CreateConfigHandlers()
# Check keys are equal
- self.assertCountEqual(conf.defaultCfg.keys(), conf.config_types)
- self.assertCountEqual(conf.userCfg.keys(), conf.config_types)
+ self.assertCountEqual(conf.defaultCfg, conf.config_types)
+ self.assertCountEqual(conf.userCfg, conf.config_types)
# Check conf parser are correct type
for default_parser in conf.defaultCfg.values():
diff --git a/Lib/idlelib/idle_test/test_debugobj.py b/Lib/idlelib/idle_test/test_debugobj.py
index 131ce22..90ace4e 100644
--- a/Lib/idlelib/idle_test/test_debugobj.py
+++ b/Lib/idlelib/idle_test/test_debugobj.py
@@ -37,7 +37,7 @@ class SequenceTreeItemTest(unittest.TestCase):
def test_keys(self):
ti = debugobj.SequenceTreeItem('label', 'abc')
- self.assertEqual(list(ti.keys()), [0, 1, 2])
+ self.assertEqual(list(ti.keys()), [0, 1, 2]) # keys() is a range.
class DictTreeItemTest(unittest.TestCase):
@@ -50,7 +50,7 @@ class DictTreeItemTest(unittest.TestCase):
def test_keys(self):
ti = debugobj.DictTreeItem('label', {1:1, 0:0, 2:2})
- self.assertEqual(ti.keys(), [0, 1, 2])
+ self.assertEqual(ti.keys(), [0, 1, 2]) # keys() is a sorted list.
if __name__ == '__main__':
diff --git a/Lib/idlelib/pyshell.py b/Lib/idlelib/pyshell.py
index 6028700..7a27079 100755
--- a/Lib/idlelib/pyshell.py
+++ b/Lib/idlelib/pyshell.py
@@ -747,10 +747,11 @@ class ModifiedInterpreter(InteractiveInterpreter):
self.tkconsole.open_stack_viewer()
def checklinecache(self):
- c = linecache.cache
- for key in list(c.keys()):
+ "Remove keys other than '<pyshell#n>'."
+ cache = linecache.cache
+ for key in list(cache): # Iterate list because mutate cache.
if key[:1] + key[-1:] != "<>":
- del c[key]
+ del cache[key]
def runcommand(self, code):
"Run the code without invoking the debugger"
diff --git a/Lib/idlelib/stackviewer.py b/Lib/idlelib/stackviewer.py
index 7b00c4c..4858cc6 100644
--- a/Lib/idlelib/stackviewer.py
+++ b/Lib/idlelib/stackviewer.py
@@ -99,7 +99,7 @@ class VariablesTreeItem(ObjectTreeItem):
def GetSubList(self):
sublist = []
- for key in self.object.keys():
+ for key in self.object.keys(): # self.object not necessarily dict.
try:
value = self.object[key]
except KeyError: