Skip to content

Commit 8d2f3c3

Browse files
bdracomethane
andauthored
gh-106664: selectors: add get() method to _SelectorMapping (#106665)
It can be used to avoid raising and catching KeyError twice via __getitem__. Co-authored-by: Inada Naoki <[email protected]>
1 parent e6e0ea0 commit 8d2f3c3

File tree

3 files changed

+16
-5
lines changed

3 files changed

+16
-5
lines changed

Lib/selectors.py

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -66,12 +66,16 @@ def __init__(self, selector):
6666
def __len__(self):
6767
return len(self._selector._fd_to_key)
6868

69+
def get(self, fileobj, default=None):
70+
fd = self._selector._fileobj_lookup(fileobj)
71+
return self._selector._fd_to_key.get(fd, default)
72+
6973
def __getitem__(self, fileobj):
70-
try:
71-
fd = self._selector._fileobj_lookup(fileobj)
72-
return self._selector._fd_to_key[fd]
73-
except KeyError:
74-
raise KeyError("{!r} is not registered".format(fileobj)) from None
74+
fd = self._selector._fileobj_lookup(fileobj)
75+
key = self._selector._fd_to_key.get(fd)
76+
if key is None:
77+
raise KeyError("{!r} is not registered".format(fileobj))
78+
return key
7579

7680
def __iter__(self):
7781
return iter(self._selector._fd_to_key)

Lib/test/test_selectors.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ def test_close(self):
223223
self.assertRaises(RuntimeError, s.get_key, wr)
224224
self.assertRaises(KeyError, mapping.__getitem__, rd)
225225
self.assertRaises(KeyError, mapping.__getitem__, wr)
226+
self.assertEqual(mapping.get(rd), None)
227+
self.assertEqual(mapping.get(wr), None)
226228

227229
def test_get_key(self):
228230
s = self.SELECTOR()
@@ -241,13 +243,17 @@ def test_get_map(self):
241243
self.addCleanup(s.close)
242244

243245
rd, wr = self.make_socketpair()
246+
sentinel = object()
244247

245248
keys = s.get_map()
246249
self.assertFalse(keys)
247250
self.assertEqual(len(keys), 0)
248251
self.assertEqual(list(keys), [])
252+
self.assertEqual(keys.get(rd), None)
253+
self.assertEqual(keys.get(rd, sentinel), sentinel)
249254
key = s.register(rd, selectors.EVENT_READ, "data")
250255
self.assertIn(rd, keys)
256+
self.assertEqual(key, keys.get(rd))
251257
self.assertEqual(key, keys[rd])
252258
self.assertEqual(len(keys), 1)
253259
self.assertEqual(list(keys), [rd.fileno()])
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
:mod:`selectors`: Add ``_SelectorMapping.get()`` method and optimize ``_SelectorMapping.__getitem__()``.

0 commit comments

Comments
 (0)