From 6249cad3c8dd0d7825eb1423bd7fe6e7d310875c Mon Sep 17 00:00:00 2001 From: Christoph Deil Date: Tue, 2 Apr 2024 15:58:37 +0200 Subject: [PATCH] Replace OrderedDict with dict (#6637) --- panel/interact.py | 3 +- panel/io/notebook.py | 3 +- panel/io/resources.py | 3 +- panel/io/server.py | 3 +- panel/io/state.py | 4 +-- panel/layout/grid.py | 14 ++++----- panel/layout/gridstack.py | 3 +- panel/models/deckgl.py | 24 +++++++------- panel/models/terminal.py | 10 +++--- panel/pane/holoviews.py | 6 ++-- panel/param.py | 4 +-- panel/pipeline.py | 4 +-- panel/tests/pane/test_holoviews.py | 17 +++++----- panel/tests/test_util.py | 1 - panel/tests/widgets/test_file_selector.py | 10 +++--- panel/tests/widgets/test_select.py | 38 +++++++++++------------ panel/tests/widgets/test_slider.py | 5 ++- panel/widgets/file_selector.py | 5 ++- panel/widgets/select.py | 10 +++--- 19 files changed, 74 insertions(+), 93 deletions(-) diff --git a/panel/interact.py b/panel/interact.py index 029204841e9..91d896273a3 100644 --- a/panel/interact.py +++ b/panel/interact.py @@ -12,7 +12,6 @@ import types -from collections import OrderedDict from collections.abc import Iterable, Mapping from inspect import ( Parameter, getcallargs, getfullargspec as check_argspec, signature, @@ -99,7 +98,7 @@ def __init__(self, object, params={}, **kwargs): widgets = self.widgets_from_abbreviations(new_kwargs) if self.manual_update: widgets.append(('manual', Button(name=self.manual_name))) - self._widgets = OrderedDict(widgets) + self._widgets = dict(widgets) pane = self.object(**self.kwargs) if isinstance(pane, Viewable): self._pane = pane diff --git a/panel/io/notebook.py b/panel/io/notebook.py index ae5dee8afe9..b7c93244364 100644 --- a/panel/io/notebook.py +++ b/panel/io/notebook.py @@ -10,7 +10,6 @@ import uuid import warnings -from collections import OrderedDict from contextlib import contextmanager from functools import partial from typing import ( @@ -176,7 +175,7 @@ def render_template( # the custom template may not reference it if manager: item = render_items[0] - item.roots._roots = OrderedDict(list(item.roots._roots.items())[:-1]) + item.roots._roots = dict(list(item.roots._roots.items())[:-1]) html = html_for_render_items( docs_json, render_items, template=document.template, diff --git a/panel/io/resources.py b/panel/io/resources.py index 8e893437dd3..8183e950098 100644 --- a/panel/io/resources.py +++ b/panel/io/resources.py @@ -14,7 +14,6 @@ import re import textwrap -from collections import OrderedDict from contextlib import contextmanager from functools import lru_cache from pathlib import Path @@ -67,7 +66,7 @@ def get_env(): ])) def conffilter(value): - return json.dumps(OrderedDict(value)).replace('"', '\'') + return json.dumps(dict(value)).replace('"', '\'') class json_dumps(json.JSONEncoder): def default(self, obj): diff --git a/panel/io/server.py b/panel/io/server.py index 539f2f147cb..26a00926069 100644 --- a/panel/io/server.py +++ b/panel/io/server.py @@ -15,7 +15,6 @@ import threading import uuid -from collections import OrderedDict from contextlib import contextmanager from functools import partial, wraps from html import escape @@ -192,7 +191,7 @@ def _initialize_session_info(session_context: 'BokehSessionContext'): state.session_info['total'] += 1 if history > 0 and len(sessions) >= history: old_history = list(sessions.items()) - sessions = OrderedDict(old_history[-(history-1):]) + sessions = dict(old_history[-(history-1):]) state.session_info['sessions'] = sessions sessions[session_id] = { 'launched': dt.datetime.now().timestamp(), diff --git a/panel/io/state.py b/panel/io/state.py index 84db2d9afc2..415631e8f92 100644 --- a/panel/io/state.py +++ b/panel/io/state.py @@ -12,7 +12,7 @@ import threading import time -from collections import Counter, OrderedDict, defaultdict +from collections import Counter, defaultdict from collections.abc import Iterator from contextlib import contextmanager from contextvars import ContextVar @@ -108,7 +108,7 @@ class _state(param.Parameterized): this will instead reflect an absolute path.""") session_info = param.Dict(default={'total': 0, 'live': 0, - 'sessions': OrderedDict()}, doc=""" + 'sessions': {}}, doc=""" Tracks information and statistics about user sessions.""") webdriver = param.Parameter(default=None, doc=""" diff --git a/panel/layout/grid.py b/panel/layout/grid.py index f8c051cce0b..08737327847 100644 --- a/panel/layout/grid.py +++ b/panel/layout/grid.py @@ -5,7 +5,7 @@ import math -from collections import OrderedDict, namedtuple +from collections import namedtuple from functools import partial from typing import ( TYPE_CHECKING, Any, ClassVar, Dict, List, Mapping, Optional, Tuple, @@ -287,7 +287,7 @@ class GridSpec(Panel): def __init__(self, **params): if 'objects' not in params: - params['objects'] = OrderedDict() + params['objects'] = {} super().__init__(**params) self._updating = False self._update_nrows() @@ -462,7 +462,7 @@ def __delitem__(self, index): subgrid = self._object_grid[yidx, xidx] if isinstance(subgrid, np.ndarray): - deleted = OrderedDict([list(o)[0] for o in subgrid.flatten()]) + deleted = dict([list(o)[0] for o in subgrid.flatten()]) else: deleted = [list(subgrid)[0][0]] for key in deleted: @@ -477,7 +477,7 @@ def __getitem__(self, index): subgrid = self._object_grid[yidx, xidx] if isinstance(subgrid, np.ndarray): - objects = OrderedDict([list(o)[0] for o in subgrid.flatten()]) + objects = dict([list(o)[0] for o in subgrid.flatten()]) gspec = self.clone(objects=objects) xoff, yoff = gspec._xoffset, gspec._yoffset adjusted = [] @@ -488,7 +488,7 @@ def __getitem__(self, index): if x1 is not None: x1 -= xoff if ((y0, x0, y1, x1), obj) not in adjusted: adjusted.append(((y0, x0, y1, x1), obj)) - gspec.objects = OrderedDict(adjusted) + gspec.objects = dict(adjusted) width_scale = gspec.ncols/float(self.ncols) height_scale = gspec.nrows/float(self.nrows) if gspec.width: @@ -535,7 +535,7 @@ def __setitem__(self, index, obj): key = (y0, x0, y1, x1) overlap = key in self.objects - clone = self.clone(objects=OrderedDict(self.objects), mode='override') + clone = self.clone(objects=dict(self.objects), mode='override') if not overlap: clone.objects[key] = panel(obj) clone._update_grid_size() @@ -545,7 +545,7 @@ def __setitem__(self, index, obj): grid[t:b, l:r] += 1 overlap_grid = grid > 1 - new_objects = OrderedDict(self.objects) + new_objects = dict(self.objects) if overlap_grid.any(): overlapping = '' objects = [] diff --git a/panel/layout/gridstack.py b/panel/layout/gridstack.py index bfb9a62e742..3f9fe804155 100644 --- a/panel/layout/gridstack.py +++ b/panel/layout/gridstack.py @@ -1,6 +1,5 @@ from __future__ import annotations -from collections import OrderedDict from typing import ClassVar, List, Mapping import param @@ -163,7 +162,7 @@ def __css__(cls): @param.depends('state', watch=True) def _update_objects(self): - objects = OrderedDict() + objects = {} object_ids = {str(id(obj)): obj for obj in self} for p in self.state: objects[(p['y0'], p['x0'], p['y1'], p['x1'])] = object_ids[p['id']] diff --git a/panel/models/deckgl.py b/panel/models/deckgl.py index 11fcb5dbe10..b57755d3c5f 100644 --- a/panel/models/deckgl.py +++ b/panel/models/deckgl.py @@ -9,8 +9,6 @@ - [PyDeck Repo](https://github.com/uber/deck.gl/tree/master/bindings/pydeck) """ -from collections import OrderedDict - from bokeh.core.properties import ( Any, Bool, Dict, Either, Instance, Int, List, Override, String, ) @@ -49,20 +47,20 @@ def __javascript__(cls): def __js_skip__(cls): return { 'deck': cls.__javascript__[:-1], - 'mapboxgl': cls.__javascript__[-1:] + 'mapboxgl': cls.__javascript__[-1:], } __js_require__ = { - 'paths': OrderedDict([ - ("h3", f"{config.npm_cdn}/h3-js@3.7.2/dist/h3-js.umd"), - ("deck-gl", f"{config.npm_cdn}/deck.gl@8.6.7/dist.min"), - ("deck-json", f"{config.npm_cdn}/@deck.gl/json@8.6.7/dist.min"), - ("loader-csv", f"{config.npm_cdn}/@loaders.gl/csv@3.1.7/dist/dist.min"), - ("loader-json", f"{config.npm_cdn}/@loaders.gl/json@3.1.7/dist/dist.min"), - ("loader-tiles", f"{config.npm_cdn}/@loaders.gl/3d-tiles@3.1.7/dist/dist.min"), - ("mapbox-gl", "https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl"), - ("carto", "{config.npm_cdn}/@deck.gl/carto@^8.7.0/dist.min.js"), - ]), + 'paths': { + "h3": f"{config.npm_cdn}/h3-js@3.7.2/dist/h3-js.umd", + "deck-gl": f"{config.npm_cdn}/deck.gl@8.6.7/dist.min", + "deck-json": f"{config.npm_cdn}/@deck.gl/json@8.6.7/dist.min", + "loader-csv": f"{config.npm_cdn}/@loaders.gl/csv@3.1.7/dist/dist.min", + "loader-json": f"{config.npm_cdn}/@loaders.gl/json@3.1.7/dist/dist.min", + "loader-tiles": f"{config.npm_cdn}/@loaders.gl/3d-tiles@3.1.7/dist/dist.min", + "mapbox-gl": "https://api.mapbox.com/mapbox-gl-js/v3.0.1/mapbox-gl", + "carto": "{config.npm_cdn}/@deck.gl/carto@^8.7.0/dist.min.js", + }, 'exports': {"deck-gl": "deck", "mapbox-gl": "mapboxgl", "h3": "h3"}, 'shim': { 'deck-json': {'deps': ["deck-gl"]}, diff --git a/panel/models/terminal.py b/panel/models/terminal.py index 3e5550ce44c..07fa870b5c3 100644 --- a/panel/models/terminal.py +++ b/panel/models/terminal.py @@ -1,5 +1,3 @@ -from collections import OrderedDict - from bokeh.core.properties import ( Any, Dict, Int, String, ) @@ -45,10 +43,10 @@ def __js_skip__(cls): } __js_require__ = { - 'paths': OrderedDict([ - ("xtermjs", XTERM_JS[:-3]), - ("xtermjsweblinks", XTERM_LINKS_JS[:-3]), - ]), + 'paths': { + "xtermjs": XTERM_JS[:-3], + "xtermjsweblinks": XTERM_LINKS_JS[:-3], + }, 'exports': { "xtermjs": "xtermjs", "xtermjsweblinks": "WebLinksAddon", diff --git a/panel/pane/holoviews.py b/panel/pane/holoviews.py index 837c7b8c409..d4d94a18849 100644 --- a/panel/pane/holoviews.py +++ b/panel/pane/holoviews.py @@ -7,7 +7,7 @@ import sys -from collections import OrderedDict, defaultdict +from collections import defaultdict from functools import partial from typing import ( TYPE_CHECKING, Any, ClassVar, Mapping, Optional, Tuple, Type, @@ -606,7 +606,7 @@ def widgets_from_dimensions(cls, object, widget_types=None, widgets_type='indivi nframes = 1 values = {} if dynamic else dict(zip(dims, zip(*keys))) - dim_values = OrderedDict() + dim_values = {} widgets = [] dims = [d for d in dims if values.get(d) is not None or d.values or d.range != (None, None)] @@ -659,7 +659,7 @@ def widgets_from_dimensions(cls, object, widget_types=None, widgets_type='indivi if all(isnumeric(v) or isinstance(v, datetime_types) for v in vals) and len(vals) > 1: vals = sorted(vals) labels = [str(dim.pprint_value(v)) for v in vals] - options = OrderedDict(zip(labels, vals)) + options = dict(zip(labels, vals)) widget_type = widget_type or DiscreteSlider else: options = list(vals) diff --git a/panel/param.py b/panel/param.py index 0bbb897de4d..f30bccaccb2 100644 --- a/panel/param.py +++ b/panel/param.py @@ -13,7 +13,7 @@ import textwrap import types -from collections import OrderedDict, defaultdict, namedtuple +from collections import defaultdict, namedtuple from collections.abc import Callable from contextlib import contextmanager from functools import partial @@ -712,7 +712,7 @@ def _get_widgets(self): else: widgets = [] widgets += [(pname, self.widget(pname)) for pname in self._ordered_params] - return OrderedDict(widgets) + return dict(widgets) def _get_model( self, doc: Document, root: Optional[Model] = None, diff --git a/panel/pipeline.py b/panel/pipeline.py index 99eb896389b..876e3b6eb6e 100644 --- a/panel/pipeline.py +++ b/panel/pipeline.py @@ -3,7 +3,7 @@ import sys import traceback as tb -from collections import OrderedDict, defaultdict +from collections import defaultdict from typing import ClassVar, Tuple import param @@ -177,7 +177,7 @@ def __init__(self, stages=[], graph={}, **params): # Initialize internal state self._stage = None - self._stages = OrderedDict() + self._stages = {} self._states = {} self._state = None self._linear = True diff --git a/panel/tests/pane/test_holoviews.py b/panel/tests/pane/test_holoviews.py index 3ab00e8047e..7b82e54d8ac 100644 --- a/panel/tests/pane/test_holoviews.py +++ b/panel/tests/pane/test_holoviews.py @@ -1,8 +1,6 @@ import datetime as dt import warnings -from collections import OrderedDict - import numpy as np import pytest @@ -292,7 +290,7 @@ def test_holoviews_widgets_from_dynamicmap(document, comm): assert isinstance(widgets[5], DiscreteSlider) assert widgets[5].name == 'F' - assert widgets[5].options == OrderedDict([(str(v), v) for v in value_numeric_dim.values]) + assert widgets[5].options == {str(v): v for v in value_numeric_dim.values} assert widgets[5].value == value_numeric_dim.default @@ -473,7 +471,7 @@ def test_holoviews_widgets_from_holomap(): assert isinstance(widgets[0], DiscreteSlider) assert widgets[0].name == 'X' - assert widgets[0].options == OrderedDict([(str(i), i) for i in range(3)]) + assert widgets[0].options == {str(i): i for i in range(3)} assert widgets[0].value == 0 assert isinstance(widgets[1], Select) @@ -490,10 +488,11 @@ def test_holoviews_date_slider_widgets_from_holomap(): assert isinstance(widgets[0], DiscreteSlider) assert widgets[0].name == 'X' - assert widgets[0].options == OrderedDict([ - ('2016-01-01 00:00:00', dt.datetime(2016, 1, 1)), - ('2016-01-02 00:00:00', dt.datetime(2016, 1, 2)), - ('2016-01-03 00:00:00', dt.datetime(2016, 1, 3))]) + assert widgets[0].options == { + '2016-01-01 00:00:00': dt.datetime(2016, 1, 1), + '2016-01-02 00:00:00': dt.datetime(2016, 1, 2), + '2016-01-03 00:00:00': dt.datetime(2016, 1, 3), + } assert widgets[0].value == dt.datetime(2016, 1, 1) @@ -505,7 +504,7 @@ def test_holoviews_widgets_explicit_widget_type_override(): assert isinstance(widgets[0], Select) assert widgets[0].name == 'X' - assert widgets[0].options == OrderedDict([(str(i), i) for i in range(3)]) + assert widgets[0].options == {str(i): i for i in range(3)} assert widgets[0].value == 0 diff --git a/panel/tests/test_util.py b/panel/tests/test_util.py index aec1427419b..0efd3b162db 100644 --- a/panel/tests/test_util.py +++ b/panel/tests/test_util.py @@ -86,7 +86,6 @@ def test_abbreviated_repr_dict(): def test_abbreviated_repr_list(): assert abbreviated_repr(['some really, really long string']) == "['some really, ...]" - def test_abbreviated_repr_ordereddict(): if sys.version_info >= (3, 12): expected = "OrderedDict({'key': 'some ...])" diff --git a/panel/tests/widgets/test_file_selector.py b/panel/tests/widgets/test_file_selector.py index 32b5b0be6ef..1917cd0f8e2 100644 --- a/panel/tests/widgets/test_file_selector.py +++ b/panel/tests/widgets/test_file_selector.py @@ -1,7 +1,5 @@ import os -from collections import OrderedDict - import pytest from panel.widgets import FileSelector @@ -159,9 +157,9 @@ def test_file_selector_multiple_across_dirs(test_dir): selector._selector._lists[True].value = ['\U0001f4c1'+os.path.join('..', 'subdir2')] selector._selector._buttons[False].clicks = 1 - assert selector._selector.options == OrderedDict([ - ('a', os.path.join(test_dir, 'subdir1', 'a')), - ('b', os.path.join(test_dir, 'subdir1', 'b')) - ]) + assert selector._selector.options == { + 'a': os.path.join(test_dir, 'subdir1', 'a'), + 'b': os.path.join(test_dir, 'subdir1', 'b'), + } assert selector._selector._lists[False].options == ['b'] assert selector.value == [os.path.join(test_dir, 'subdir1', 'a')] diff --git a/panel/tests/widgets/test_select.py b/panel/tests/widgets/test_select.py index c250a0b03cc..ff8dd3922e3 100644 --- a/panel/tests/widgets/test_select.py +++ b/panel/tests/widgets/test_select.py @@ -1,5 +1,3 @@ -from collections import OrderedDict - import numpy as np import pytest @@ -182,7 +180,7 @@ def test_select_non_hashable_options(document, comm): def test_select_mutables(document, comm): - opts = OrderedDict([('A', [1,2,3]), ('B', [2,4,6]), ('C', dict(a=1,b=2))]) + opts = {'A': [1,2,3], 'B': [2,4,6], 'C': dict(a=1,b=2)} select = Select(options=opts, value=opts['B'], name='Select') widget = select.get_root(document, comm=comm) @@ -205,12 +203,12 @@ def test_select_mutables(document, comm): def test_select_change_options_on_watch(document, comm): - select = Select(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), - value='A', name='Select') + select = Select(options={'A': 'A', '1': 1, 'C': object}, + value='A', name='Select') def set_options(event): if event.new == 1: - select.options = OrderedDict([('D', 2), ('E', 'a')]) + select.options = {'D': 2, 'E': 'a'} select.param.watch(set_options, 'value') model = select.get_root(document, comm=comm) @@ -811,7 +809,7 @@ def test_select_disabled_options_set_value_and_disabled_options(options, size, d def test_multi_select(document, comm): - select = MultiSelect(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + select = MultiSelect(options={'A': 'A', '1': 1, 'C': object}, value=[object, 1], name='Select') widget = select.get_root(document, comm=comm) @@ -834,7 +832,7 @@ def test_multi_select(document, comm): def test_multi_choice(document, comm): - choice = MultiChoice(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + choice = MultiChoice(options={'A': 'A', '1': 1, 'C': object}, value=[object, 1], name='MultiChoice') widget = choice.get_root(document, comm=comm) @@ -857,12 +855,12 @@ def test_multi_choice(document, comm): def test_multi_select_change_options(document, comm): - select = MultiSelect(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + select = MultiSelect(options={'A': 'A', '1': 1, 'C': object}, value=[object, 1], name='Select') def set_options(event): if event.new == [1]: - select.options = OrderedDict([('D', 2), ('E', 'a')]) + select.options = {'D': 2, 'E': 'a'} select.param.watch(set_options, 'value') model = select.get_root(document, comm=comm) @@ -874,22 +872,22 @@ def set_options(event): def test_toggle_group_error_init(document, comm): with pytest.raises(ValueError): - ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + ToggleGroup(options={'A': 'A', '1': 1, 'C': object}, value=1, name='RadioButtonGroup', widget_type='button', behavior='check') with pytest.raises(ValueError): - ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + ToggleGroup(options={'A': 'A', '1': 1, 'C': object}, value=[1, object], name='RadioButtonGroup', widget_type='button', behavior='radio') with pytest.raises(ValueError): - ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + ToggleGroup(options={'A': 'A', '1': 1, 'C': object}, value=[1, object], name='RadioButtonGroup', widget_type='buttons') with pytest.raises(ValueError): - ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), + ToggleGroup(options={'A': 'A', '1': 1, 'C': object}, value=[1, object], name='RadioButtonGroup', behavior='checks') @@ -897,9 +895,9 @@ def test_toggle_group_error_init(document, comm): def test_toggle_group_check(document, comm): for widget_type in ToggleGroup._widgets_type: - select = ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), - value=[1, object], name='CheckButtonGroup', - widget_type=widget_type, behavior='check') + select = ToggleGroup(options={'A': 'A', '1': 1, 'C': object}, + value=[1, object], name='CheckButtonGroup', + widget_type=widget_type, behavior='check') widget = select.get_root(document, comm=comm) @@ -931,9 +929,9 @@ def test_toggle_group_check(document, comm): def test_toggle_group_radio(document, comm): for widget_type in ToggleGroup._widgets_type: - select = ToggleGroup(options=OrderedDict([('A', 'A'), ('1', 1), ('C', object)]), - value=1, name='RadioButtonGroup', - widget_type=widget_type, behavior='radio') + select = ToggleGroup(options={'A': 'A', '1': 1, 'C': object}, + value=1, name='RadioButtonGroup', + widget_type=widget_type, behavior='radio') widget = select.get_root(document, comm=comm) diff --git a/panel/tests/widgets/test_slider.py b/panel/tests/widgets/test_slider.py index 3b1fba582fc..6147c03d9f2 100644 --- a/panel/tests/widgets/test_slider.py +++ b/panel/tests/widgets/test_slider.py @@ -1,4 +1,3 @@ -from collections import OrderedDict from datetime import date, datetime import pytest @@ -369,7 +368,7 @@ def test_discrete_slider_disabled(document, comm): def test_discrete_date_slider(document, comm): - dates = OrderedDict([('2016-01-0%d' % i, datetime(2016, 1, i)) for i in range(1, 4)]) + dates = {'2016-01-0%d' % i: datetime(2016, 1, i) for i in range(1, 4)} discrete_slider = DiscreteSlider(name='DiscreteSlider', value=dates['2016-01-02'], options=dates) @@ -408,7 +407,7 @@ def test_discrete_date_slider(document, comm): def test_discrete_slider_options_dict(document, comm): - options = OrderedDict([('0.1', 0.1), ('1', 1), ('10', 10), ('100', 100)]) + options = {'0.1': 0.1, '1': 1, '10': 10, '100': 100} discrete_slider = DiscreteSlider(name='DiscreteSlider', value=1, options=options) diff --git a/panel/widgets/file_selector.py b/panel/widgets/file_selector.py index 7a4583c23c6..6a11de449cd 100644 --- a/panel/widgets/file_selector.py +++ b/panel/widgets/file_selector.py @@ -6,7 +6,6 @@ import os -from collections import OrderedDict from fnmatch import fnmatch from typing import ( AnyStr, ClassVar, List, Optional, Tuple, Type, @@ -225,7 +224,7 @@ def _update_files( paths = [p for p in sorted(dirs)+sorted(files) if self.show_hidden or not os.path.basename(p).startswith('.')] abbreviated = [('📁' if f in dirs else '')+os.path.relpath(f, self._cwd) for f in paths] - options = OrderedDict(zip(abbreviated, paths)) + options = dict(zip(abbreviated, paths)) self._selector.options = options self._selector.value = selected @@ -238,7 +237,7 @@ def _filter_denylist(self, event: param.parameterized.Event): dirs, files = _scan_path(self._cwd, self.file_pattern) paths = [('📁' if p in dirs else '')+os.path.relpath(p, self._cwd) for p in dirs+files] denylist = self._selector._lists[False] - options = OrderedDict(self._selector._items) + options = dict(self._selector._items) self._selector.options.clear() self._selector.options.update([ (k, v) for k, v in options.items() if k in paths or v in self.value diff --git a/panel/widgets/select.py b/panel/widgets/select.py index bd959106cc7..b461f4bae8b 100644 --- a/panel/widgets/select.py +++ b/panel/widgets/select.py @@ -7,7 +7,6 @@ import itertools import re -from collections import OrderedDict from types import FunctionType from typing import ( TYPE_CHECKING, Any, ClassVar, Dict, List, Mapping, Type, @@ -64,8 +63,7 @@ def values(self): @property def _items(self): - return OrderedDict(zip(self.labels, self.values)) - + return dict(zip(self.labels, self.values)) class SingleSelectBase(SelectBase): @@ -1361,12 +1359,12 @@ def _apply_selection(self, event): """ selected = event.obj is self._buttons[True] - new = OrderedDict([(k, self._items[k]) for k in self._selections[not selected]]) + new = {k: self._items[k] for k in self._selections[not selected]} old = self._lists[selected].options other = self._lists[not selected].options - merged = OrderedDict([(k, k) for k in list(old)+list(new)]) - leftovers = OrderedDict([(k, k) for k in other if k not in new]) + merged = {k: k for k in list(old)+list(new)} + leftovers = {k: k for k in other if k not in new} self._lists[selected].options = merged if merged else {} self._lists[not selected].options = leftovers if leftovers else {} if len(self._lists[True].options):