Skip to content

Commit

Permalink
pythongh-106664: selectors: add get() method to _SelectorMapping (pyt…
Browse files Browse the repository at this point in the history
…hon#106665)

It can be used to avoid raising and catching KeyError twice via __getitem__.

Co-authored-by: Inada Naoki <songofacandy@gmail.com>
  • Loading branch information
2 people authored and kgdiem committed Jul 14, 2023
1 parent ca8147a commit 58025d6
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 5 deletions.
14 changes: 9 additions & 5 deletions Lib/selectors.py
Expand Up @@ -66,12 +66,16 @@ def __init__(self, selector):
def __len__(self):
return len(self._selector._fd_to_key)

def get(self, fileobj, default=None):
fd = self._selector._fileobj_lookup(fileobj)
return self._selector._fd_to_key.get(fd, default)

def __getitem__(self, fileobj):
try:
fd = self._selector._fileobj_lookup(fileobj)
return self._selector._fd_to_key[fd]
except KeyError:
raise KeyError("{!r} is not registered".format(fileobj)) from None
fd = self._selector._fileobj_lookup(fileobj)
key = self._selector._fd_to_key.get(fd)
if key is None:
raise KeyError("{!r} is not registered".format(fileobj))
return key

def __iter__(self):
return iter(self._selector._fd_to_key)
Expand Down
6 changes: 6 additions & 0 deletions Lib/test/test_selectors.py
Expand Up @@ -223,6 +223,8 @@ def test_close(self):
self.assertRaises(RuntimeError, s.get_key, wr)
self.assertRaises(KeyError, mapping.__getitem__, rd)
self.assertRaises(KeyError, mapping.__getitem__, wr)
self.assertEqual(mapping.get(rd), None)
self.assertEqual(mapping.get(wr), None)

def test_get_key(self):
s = self.SELECTOR()
Expand All @@ -241,13 +243,17 @@ def test_get_map(self):
self.addCleanup(s.close)

rd, wr = self.make_socketpair()
sentinel = object()

keys = s.get_map()
self.assertFalse(keys)
self.assertEqual(len(keys), 0)
self.assertEqual(list(keys), [])
self.assertEqual(keys.get(rd), None)
self.assertEqual(keys.get(rd, sentinel), sentinel)
key = s.register(rd, selectors.EVENT_READ, "data")
self.assertIn(rd, keys)
self.assertEqual(key, keys.get(rd))
self.assertEqual(key, keys[rd])
self.assertEqual(len(keys), 1)
self.assertEqual(list(keys), [rd.fileno()])
Expand Down
@@ -0,0 +1 @@
:mod:`selectors`: Add ``_SelectorMapping.get()`` method and optimize ``_SelectorMapping.__getitem__()``.

0 comments on commit 58025d6

Please sign in to comment.