Skip to content

Commit cf1b35f

Browse files
committed
gh-89520: IDLE - Replace ChainMap misuse with set union in config.py
ChainMap is designed for Mapping types, not lists. GetOptionList() returns a list of strings, so passing these to ChainMap only worked by accident via CPython's dict.fromkeys() in ChainMap.__iter__. Replace with set() union, matching the pattern already used in GetExtensionKeys. The actual user-over-default prioritization is handled by GetOption(), not by the iteration order.
1 parent eb194c3 commit cf1b35f

1 file changed

Lines changed: 12 additions & 11 deletions

File tree

Lib/idlelib/config.py

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,6 @@
2828
from configparser import ConfigParser
2929
import os
3030
import sys
31-
from collections import ChainMap
3231

3332
from tkinter.font import Font
3433
import idlelib
@@ -509,14 +508,17 @@ def __GetRawExtensionKeys(self, extension_name):
509508
bindings_section = f'{extension_name}_cfgBindings'
510509
extension_keys = {}
511510

512-
event_names = []
511+
event_names = set()
513512
if self.userCfg['extensions'].has_section(bindings_section):
514-
event_names.append(self.userCfg['extensions'].GetOptionList(bindings_section))
513+
event_names |= set(
514+
self.userCfg['extensions'].GetOptionList(bindings_section)
515+
)
515516
if self.defaultCfg['extensions'].has_section(bindings_section):
516-
event_names.append(self.defaultCfg['extensions'].GetOptionList(bindings_section))
517+
event_names |= set(
518+
self.defaultCfg['extensions'].GetOptionList(bindings_section)
519+
)
517520

518-
# Because chain map, favors user bindings over default bindings
519-
for event_name in ChainMap(*event_names):
521+
for event_name in event_names:
520522
binding = self.GetOption(
521523
'extensions',
522524
bindings_section,
@@ -538,18 +540,17 @@ def GetExtensionBindings(self, extension_name):
538540
extension_keys = self.GetExtensionKeys(extension_name)
539541

540542
# add the non-configurable bindings
541-
values = []
543+
event_names = set()
542544
if self.userCfg['extensions'].has_section(bindings_section):
543-
values.append(
545+
event_names |= set(
544546
self.userCfg['extensions'].GetOptionList(bindings_section)
545547
)
546548
if self.defaultCfg['extensions'].has_section(bindings_section):
547-
values.append(
549+
event_names |= set(
548550
self.defaultCfg['extensions'].GetOptionList(bindings_section)
549551
)
550552

551-
# Because chain map, favors user bindings over default bindings
552-
for event_name in ChainMap(*values):
553+
for event_name in event_names:
553554
binding = self.GetOption(
554555
'extensions',
555556
bindings_section,

0 commit comments

Comments
 (0)