[Python-checkins] cpython: Issue #19172: Add a get_map() method to selectors.
charles-francois.natali
python-checkins at python.org
Wed Oct 30 20:31:54 CET 2013
http://hg.python.org/cpython/rev/b0ae96700301
changeset: 86784:b0ae96700301
user: Charles-François Natali <cf.natali at gmail.com>
date: Wed Oct 30 20:31:04 2013 +0100
summary:
Issue #19172: Add a get_map() method to selectors.
files:
Doc/library/selectors.rst | 8 +++++++
Lib/selectors.py | 27 +++++++++++++++++++++++++-
Lib/test/test_selectors.py | 27 ++++++++++++++++++++++++++
3 files changed, 61 insertions(+), 1 deletions(-)
diff --git a/Doc/library/selectors.rst b/Doc/library/selectors.rst
--- a/Doc/library/selectors.rst
+++ b/Doc/library/selectors.rst
@@ -164,6 +164,14 @@
This returns the :class:`SelectorKey` instance associated to this file
object, or raises :exc:`KeyError` if the file object is not registered.
+ .. method:: get_map()
+
+ Return a mapping of file objects to selector keys.
+
+ This returns a :class:`~collections.abc.Mapping` instance mapping
+ registered file objects to their associated :class:`SelectorKey`
+ instance.
+
.. class:: DefaultSelector()
diff --git a/Lib/selectors.py b/Lib/selectors.py
--- a/Lib/selectors.py
+++ b/Lib/selectors.py
@@ -6,7 +6,7 @@
from abc import ABCMeta, abstractmethod
-from collections import namedtuple
+from collections import namedtuple, Mapping
import functools
import select
import sys
@@ -44,6 +44,25 @@
selected event mask and attached data."""
+class _SelectorMapping(Mapping):
+ """Mapping of file objects to selector keys."""
+
+ def __init__(self, selector):
+ self._selector = selector
+
+ def __len__(self):
+ return len(self._selector._fd_to_key)
+
+ def __getitem__(self, fileobj):
+ try:
+ return self._selector._fd_to_key[_fileobj_to_fd(fileobj)]
+ except KeyError:
+ raise KeyError("{!r} is not registered".format(fileobj)) from None
+
+ def __iter__(self):
+ return iter(self._selector._fd_to_key)
+
+
class BaseSelector(metaclass=ABCMeta):
"""Base selector class.
@@ -62,6 +81,8 @@
def __init__(self):
# this maps file descriptors to keys
self._fd_to_key = {}
+ # read-only mapping returned by get_map()
+ self._map = _SelectorMapping(self)
def register(self, fileobj, events, data=None):
"""Register a file object.
@@ -162,6 +183,10 @@
except KeyError:
raise KeyError("{!r} is not registered".format(fileobj)) from None
+ def get_map(self):
+ """Return a mapping of file objects to selector keys."""
+ return self._map
+
def __enter__(self):
return self
diff --git a/Lib/test/test_selectors.py b/Lib/test/test_selectors.py
--- a/Lib/test/test_selectors.py
+++ b/Lib/test/test_selectors.py
@@ -153,6 +153,33 @@
# unknown file obj
self.assertRaises(KeyError, s.get_key, 999999)
+ def test_get_map(self):
+ s = self.SELECTOR()
+ self.addCleanup(s.close)
+
+ rd, wr = socketpair()
+ self.addCleanup(rd.close)
+ self.addCleanup(wr.close)
+
+ keys = s.get_map()
+ self.assertFalse(keys)
+ self.assertEqual(len(keys), 0)
+ self.assertEqual(list(keys), [])
+ key = s.register(rd, selectors.EVENT_READ, "data")
+ self.assertIn(rd, keys)
+ self.assertEqual(key, keys[rd])
+ self.assertEqual(len(keys), 1)
+ self.assertEqual(list(keys), [rd.fileno()])
+ self.assertEqual(list(keys.values()), [key])
+
+ # unknown file obj
+ with self.assertRaises(KeyError):
+ keys[999999]
+
+ # Read-only mapping
+ with self.assertRaises(TypeError):
+ del keys[rd]
+
def test_select(self):
s = self.SELECTOR()
self.addCleanup(s.close)
--
Repository URL: http://hg.python.org/cpython
More information about the Python-checkins
mailing list